使用Jest测试含依赖的NestJS Service时Getter模拟失败问题
解决Jest测试NestJS时createMock未生成Getter导致spyOn报错的问题
问题根源
@golevelup/ts-jest的createMock工具默认不会为类的Getter属性生成对应的访问器Mock,只会生成普通方法或属性的Mock。当你尝试用jest.spyOn()去监听一个不存在的Getter时,就会抛出Error: Property SomeSetting does not have access type get错误。
解决方案
方案一:手动构建包含Getter的Mock对象
直接创建带有Getter属性的Mock对象,确保jest.spyOn()能识别到访问器类型:
import { Test, TestingModule } from '@nestjs/testing'; import { ParentService, DependencyService } from './service'; describe('ParentService', () => { let service: ParentService; let testConfig: DependencyService; afterEach(() => { jest.clearAllMocks(); }); beforeEach(async () => { // 手动创建带Getter的Mock const mockDependency = { get SomeSetting(): number { return 1; // 默认返回值 } } as DependencyService; const module: TestingModule = await Test.createTestingModule({ providers: [ ParentService, { provide: DependencyService, useValue: mockDependency }, ], }).compile(); service = module.get<ParentService>(ParentService); testConfig = module.get<DependencyService>(DependencyService); }); it('should return mocked SomeSetting value', () => { // 模拟Getter返回自定义值 jest.spyOn(testConfig, 'SomeSetting', 'get').mockReturnValue(10); expect(service.Setting).toBe(10); }); });
方案二:直接SpyOn类原型的Getter
跳过createMock,直接在DependencyService的原型上模拟Getter,这种方式更简洁:
import { Test, TestingModule } from '@nestjs/testing'; import { ParentService, DependencyService } from './service'; describe('ParentService', () => { let service: ParentService; afterEach(() => { jest.clearAllMocks(); }); beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ParentService, DependencyService], }).compile(); service = module.get<ParentService>(ParentService); // 直接模拟原型上的Getter jest.spyOn(DependencyService.prototype, 'SomeSetting', 'get').mockReturnValue(5); }); it('should return mocked value from DependencyService', () => { expect(service.Setting).toBe(5); }); });
方案三:调整createMock的使用(针对部分支持版本)
如果你的@golevelup/ts-jest版本支持,可以通过传递类型元信息让createMock生成Getter,但这种方式兼容性不如前两种可靠。例如:
import { createMock } from '@golevelup/ts-jest'; // 手动指定要生成Getter的属性 const mockDependency = createMock<DependencyService>({}, { getterNames: ['SomeSetting'] });
注意:此配置需确认你的版本是否支持该参数,若版本较低可能无效。
内容的提问来源于stack exchange,提问作者Steven Scott
相关产品推荐
相关产品推荐

