Nest.js 测试模块,无法覆盖注入到另一个提供者中的提供者,未定义接收
Nest.js testing module, can not override provider injected into another provider, undefined received
我有 Nest.js 应用程序,其中某个提供商被注入另一个提供商:
export class AppService {
public constructor(private readonly appInnerService: AppInnerService) {}
}
AppService 有一个方法 publish
调用 appInnerService send
方法。我为 AppService 创建了单元测试,我想在其中模拟 AppInnerService 提供程序:
describe('App service', () => {
let appService: AppService;
const appInnerService = {
send: jest.fn(),
};
beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
providers: [AppService, AppInnerService],
})
.overrideProvider(AppInnerService)
.useValue(appInnerService)
.compile();
appService = moduleRef.get<AppService>(AppService);
});
it('should work', () => {
appService.publish({});
expect(appInnerService.send).toHaveBeenCalled();
});
}
以上代码不起作用,AppInnerService 没有注入到 AppService 中,而是将 undefined 传递给构造函数。为什么上面的测试不起作用,我该如何修复它(无需使用模拟服务手动创建 AppService class,我想使用由 @nestjs/testing 包创建的测试模块)?
为了解决问题:AppService
需要用 @Injectable()
修饰才能让打字稿反映构造函数参数元数据。只是 Injectable()
一样,它只是一个函数调用而不是装饰器,因此元数据没有反映出来,Nest 无法对其进行操作。
我有 Nest.js 应用程序,其中某个提供商被注入另一个提供商:
export class AppService {
public constructor(private readonly appInnerService: AppInnerService) {}
}
AppService 有一个方法 publish
调用 appInnerService send
方法。我为 AppService 创建了单元测试,我想在其中模拟 AppInnerService 提供程序:
describe('App service', () => {
let appService: AppService;
const appInnerService = {
send: jest.fn(),
};
beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
providers: [AppService, AppInnerService],
})
.overrideProvider(AppInnerService)
.useValue(appInnerService)
.compile();
appService = moduleRef.get<AppService>(AppService);
});
it('should work', () => {
appService.publish({});
expect(appInnerService.send).toHaveBeenCalled();
});
}
以上代码不起作用,AppInnerService 没有注入到 AppService 中,而是将 undefined 传递给构造函数。为什么上面的测试不起作用,我该如何修复它(无需使用模拟服务手动创建 AppService class,我想使用由 @nestjs/testing 包创建的测试模块)?
为了解决问题:AppService
需要用 @Injectable()
修饰才能让打字稿反映构造函数参数元数据。只是 Injectable()
一样,它只是一个函数调用而不是装饰器,因此元数据没有反映出来,Nest 无法对其进行操作。