我正在尝试测试我的AuthModule控制器HTTP层和supertest,如官方Nestjs文档中所描述的那样。此模块使用从EmailService导入的EmailModule。
我知道您可以按以下方式覆盖提供程序:
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [
AuthModule,
],
})
.overrideProvider(EmailService)
.useValue(buildMock(EmailService))但这不起作用,我想是因为EmailModule是在AuthModule中导入的。解决办法是.overrideProvider(...).useValue(...) EmailModule中的每个提供程序,但这是不合理的,因为我随后也不得不模拟EmailModule导入的模块。
在e2e测试AuthModule时,老实说,我并不关心EmailModule是如何工作的。我需要模拟的只是EmailService,并确保我的auth模块与该服务进行了正确的交互。
不幸的是,Test.createTestingModule({})没有.overrideModule()方法。
我试着用玩笑来嘲弄EmailModule:
jest.mock('../../src/email/email.module.ts', () => {
@Module({})
class EmailModule {
}
return EmailModule;
});但我知道这个错误:
Error: Nest cannot create the module instance. Often, this is because of a circular dependency between modules. Use forwardRef() to avoid it.
(Read more: https://docs.nestjs.com/fundamentals/circular-dependency)
Scope [RootTestModule -> AppModule]有人知道如何才能做到这一点吗?
发布于 2021-12-20 10:57:30
我花了很长时间来尝试如何模拟一个完整的NestJS模块。下面是对我有用的东西。
// Create a valid NestJS module to be used in place of the one we want to mock
@Module({})
class MockModule {}
// Identify the Module you want to mock and mock it
jest.mock('module-to-mock', () => {
return {
ModuleToMockName: {
forRootAsync: jest.fn().mockImplementation(() => MockModule),
}
};
});基本上,我们为NestJS提供了一个有效的模块,在这种情况下,它什么也不做,而是可以编码,以便以可预测/可测试的方式运行。
发布于 2021-10-09 12:51:12
我解决这个问题的方法是创建一个全局的TestModule:
@Global()
@Module({
providers: [
{
provide: EmailService,
useValue: {} // mock
},
],
})
class TestModule {}在测试模块开始时导入TestModule:
const module = await Test.createTestingModule({
imports: [
TestModule,
AuthModule,
// ...
]
}).compile();这样,EmailService是全局提供的,您不再需要导入EmailModule了。
全局模块被解释为这里。
发布于 2021-10-03 17:31:33
您是否只是尝试在测试模块中提供EmailService?看起来会是这样的:
const module: TestingModule = await Test.createTestingModule({
controllers: [AuthController],
providers: [
EmailService
],
}).compile();我认为您可以跳过导入整个EmailModule并提供所需的内容。
https://stackoverflow.com/questions/60756629
复制相似问题