如何在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
相关产品推荐
相关产品推荐

