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

如何在NestJS单元测试中Mock并解决Automapper依赖问题?

解决NestJS单元测试中Automapper依赖解析错误

你的问题核心是测试模块未提供Automapper的Mock实例,导致Nest无法解析ProductController的第三个依赖项(即automapper:nestjs:default)。以下是具体解决步骤:

1. 在测试模块中手动Mock Automapper

直接在Test.createTestingModule的providers数组中添加一个Mock的Automapper提供者,使用它的注入令牌(可以是常量AUTOMAPPER_TOKEN或错误中提到的automapper:nestjs:default字符串)。

示例测试代码:

import { Test } from '@nestjs/testing';
import { ProductController } from './product.controller';
import { CommandBus, QueryBus } from '@nestjs/cqrs';
import { AUTOMAPPER_TOKEN } from '@automapper/nestjs';

describe('ProductController', () => {
  let controller: ProductController;
  let mockMapper: ReturnType<typeof createMockAutomapper>;

  // 封装Mock逻辑,按需添加你用到的Automapper方法
  function createMockAutomapper() {
    return {
      map: jest.fn().mockReturnValue({}),
      mapAsync: jest.fn().mockResolvedValue({}),
      // 比如你的代码用到了mapArray,就加上mapArray: jest.fn().mockReturnValue([])
    };
  }

  beforeEach(async () => {
    mockMapper = createMockAutomapper();

    const moduleRef = await Test.createTestingModule({
      controllers: [ProductController],
      providers: [
        CommandBus,
        QueryBus,
        {
          provide: AUTOMAPPER_TOKEN, // 等价于硬编码 'automapper:nestjs:default'
          useValue: mockMapper,
        },
      ],
    }).compile();

    controller = moduleRef.get<ProductController>(ProductController);
  });

  it('should initialize controller successfully', () => {
    expect(controller).toBeDefined();
  });

  // 示例:验证Automapper方法是否被正确调用
  it('should trigger mapper.map when creating product', async () => {
    const testDto = { name: 'Test Product', price: 99 };
    await controller.create(testDto);
    
    expect(mockMapper.map).toHaveBeenCalledWith(
      testDto,
      expect.any(Object), // 对应你的源类型
      expect.any(Object)  // 对应你的目标类型
    );
  });
});

2. (可选)复用Mock逻辑

如果多个测试文件都需要Automapper的Mock,可以把Mock逻辑抽成工具函数:

// test-utils/mock-automapper.ts
import { jest } from '@jest/globals';

export const createMockAutomapper = () => ({
  map: jest.fn().mockReturnValue({}),
  mapAsync: jest.fn().mockResolvedValue({}),
  mapArray: jest.fn().mockReturnValue([]),
  // 其他你用到的方法
});

之后在测试文件中直接导入使用即可。

注意事项

  • 如果你的项目中自定义了Automapper的命名(比如不是默认的default实例),需要将provide的值替换为你自定义的令牌。
  • 确保Mock的方法覆盖了你在控制器/服务中实际调用的Automapper方法,否则测试执行时会因方法不存在而报错。

内容的提问来源于stack exchange,提问作者Harihara Krishnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:38:30