如何在Automock Jest模块中Mock或注入真实Automapper依赖
解决@automock/jest中Mock或使用真实Automapper Mapper的问题
一、Mock Mapper的正确方式
你遇到的TS2693错误是因为Mapper是TypeScript类型,而非运行时可用的值。@automapper/nestjs通过注入令牌识别Mapper,需要用getToken()函数获取对应的令牌。
步骤1:导入必要工具
从@automapper/nestjs导入getToken,从@automapper/core导入Mapper类型:
import { getToken } from '@automapper/nestjs'; import { Mapper } from '@automapper/core'; import { TestBed } from '@automock/jest'; import { FooService } from './foo.service';
步骤2:Mock并获取Mock实例
在测试中使用getToken()作为mock目标,然后获取mock对象:
describe('FooService', () => { let service: FooService; let mapper: jest.Mocked<Mapper>; beforeEach(() => { const { unit, unitRef } = TestBed.create(FooService) .mock(getToken()) // 使用getToken()获取注入令牌 .using({ // 按需mock Mapper方法,例如map方法 map: jest.fn().mockReturnValue({ /* 模拟返回值 */ }) }) .compile(); service = unit; mapper = unitRef.get(getToken()) as jest.Mocked<Mapper>; }); it('should use mocked mapper', () => { service.someMethod(); expect(mapper.map).toHaveBeenCalled(); }); });
如果项目中使用命名Mapper(比如@InjectMapper('custom')),需把名称传给getToken:
.mock(getToken('custom')) // 获取实例时 mapper = unitRef.get(getToken('custom')) as jest.Mocked<Mapper>;
二、使用真实Mapper实例
若需在测试中使用真实的Automapper实例,需初始化AutomapperModule并添加到测试床的imports中:
步骤1:配置并导入AutomapperModule
import { AutomapperModule, getToken } from '@automapper/nestjs'; import { classes } from '@automapper/classes'; import { Mapper } from '@automapper/core'; import { TestBed } from '@automock/jest'; import { FooService } from './foo.service'; // 导入你的映射配置文件 import { fooProfile } from './foo.profile'; describe('FooService', () => { let service: FooService; let mapper: Mapper; beforeEach(async () => { const { unit, unitRef } = await TestBed.create(FooService) .configure({ imports: [ AutomapperModule.forRoot({ strategyInitializer: classes(), // 根据映射策略选择,如classes、pojos等 }), AutomapperModule.forFeature([fooProfile]) // 加载映射配置 ] }) .compile(); service = unit; mapper = unitRef.get(getToken()); }); it('should use real mapper', () => { const result = service.someMappingMethod(); expect(result).toEqual(/* 预期的映射结果 */); }); });
关键说明
getToken()是@automapper/nestjs的核心工具,用于获取Mapper对应的注入令牌,解决类型与运行时值不匹配的问题。- 使用命名Mapper时,务必在
getToken()中传入对应名称,确保正确获取实例。
内容的提问来源于stack exchange,提问作者BJagger
相关产品推荐
相关产品推荐

