NestJS测试模块中nestjsx-automapper的profiles未找到问题咨询
NestJS单元测试集成nestjsx-automapper可行解决方案
除导入profiles外,还有两种常用的解决方案:
- 直接在测试模块的providers中注册Profile类
nestjsx-automapper的Profile本身是可注入类,直接将其添加到测试模块的providers数组即可完成映射规则加载,不需要额外导入封装了Profile的业务模块,对应调整后的测试代码如下:
describe('UserController', () => { let userServiceInterface: UserServiceInterface; beforeEach(async () => { const app: TestingModule = await Test.createTestingModule({ imports: [AutomapperModule.withMapper('user')], providers: [ UserProfile, // 替换为你实际用到的Profile类即可 { provide: 'UserServiceInterface', useClass: UserService, }, ], }).compile(); userServiceInterface = app.get<UserServiceInterface>( 'UserServiceInterface', ); }); describe('find', () => { it(`should return user with name 'pipo'`, () => { const user = userServiceInterface.find('pipo'); expect(user.username).toBe('pipo'); }); }); });
使用该方案时需要注意:@Profile()装饰器指定的mapper名称,与AutomapperModule.withMapper()传入的名称保持一致。
- Mock Automapper实例
如果你的测试逻辑不需要验证映射规则本身的正确性,仅需测试服务的业务逻辑,可以直接mock Mapper实例,不需要初始化真实的Automapper模块,测试执行效率更高,对应代码示例如下:
import { getMapperToken } from '@nestjsx/automapper'; describe('UserController', () => { let userServiceInterface: UserServiceInterface; // 按你的映射需求自定义mock映射逻辑 const mockMapper = { map: jest.fn(() => ({ username: 'pipo' })) }; beforeEach(async () => { const app: TestingModule = await Test.createTestingModule({ providers: [ { provide: 'UserServiceInterface', useClass: UserService, }, { provide: getMapperToken('user'), // 传入你的mapper名称获取对应的注入token useValue: mockMapper } ], }).compile(); userServiceInterface = app.get<UserServiceInterface>( 'UserServiceInterface', ); }); describe('find', () => { it(`should return user with name 'pipo'`, () => { const user = userServiceInterface.find('pipo'); expect(user.username).toBe('pipo'); }); }); });
内容的提问来源于stack exchange,提问作者Zackysh
相关产品推荐
相关产品推荐

