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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:52:53