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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:05:07