NestJS测试中Jest的it.each()无法读取Service的getter属性问题
问题原因
这个问题和NestJS本身无关,是Jest测试代码的执行顺序导致的:
- Jest运行测试时会先完成测试定义阶段:遍历所有describe块,同步执行所有顶层代码(包括
it.each的参数数组初始化),这个阶段beforeEach、it内部的回调都不会执行。 - 你第二组测试里的
service是通过let声明的,在定义阶段还没有被赋值(值为undefined),你直接在it.each的参数数组里访问service.Description自然就抛出了undefined读取属性的错误。 - 普通
it用例的代码是在测试执行阶段才运行的,此时beforeEach已经执行完成,service已经被初始化为正确的服务实例,所以可以正常访问。 - 第一组测试能正常运行的原因是你在describe顶层直接用new初始化了
TestClass,测试定义阶段TestClass就已经有值了,所以it.each能正常读取属性。
解决方案
只需要把属性值的读取放到测试执行阶段即可:不要在it.each的参数数组里直接读取service的属性,而是传递要读取的属性名,在测试回调内部从已经初始化完成的service实例上读取对应属性。
修改后的it.each代码如下:
// 第二个参数改为传递属性名,而非直接读取属性值 it.each([['Description', 'Description', 'text']])( 'should return the text for %s', (TestDescription: string, PropName: keyof MyService, Expected: string) => { // 测试执行阶段从已初始化的service上读取属性 const Actual = service[PropName] as string; expect(Actual).not.toBeNull(); expect(Actual).not.toBeUndefined(); expect(Actual).toBe(Expected); } );
如果需要测试多个getter,直接在it.each的参数数组中添加对应条目即可,示例:
it.each([ ['Description', 'Description', 'text'], ['其他getter属性名', 'OtherGetter', '预期返回值'] ])( 'should return the correct value for %s', (TestDescription: string, PropName: keyof MyService, Expected: string) => { const Actual = service[PropName] as string; expect(Actual).toBe(Expected); } );
内容的提问来源于stack exchange,提问作者Steven Scott
相关产品推荐
相关产品推荐

