You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:27:03