首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nestjs模拟导入模块

nestjs模拟导入模块
EN

Stack Overflow用户
提问于 2020-03-19 11:49:42
回答 3查看 7.8K关注 0票数 18

我正在尝试测试我的AuthModule控制器HTTP层supertest,如官方Nestjs文档中所描述的那样。此模块使用从EmailService导入的EmailModule

我知道您可以按以下方式覆盖提供程序:

代码语言:javascript
复制
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

代码语言:javascript
复制
jest.mock('../../src/email/email.module.ts', () => {
  @Module({})
  class EmailModule {

  }

  return EmailModule;
});

但我知道这个错误:

代码语言:javascript
复制
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]

有人知道如何才能做到这一点吗?

EN

回答 3

Stack Overflow用户

发布于 2021-12-20 10:57:30

我花了很长时间来尝试如何模拟一个完整的NestJS模块。下面是对我有用的东西。

代码语言:javascript
复制
// 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提供了一个有效的模块,在这种情况下,它什么也不做,而是可以编码,以便以可预测/可测试的方式运行。

票数 4
EN

Stack Overflow用户

发布于 2021-10-09 12:51:12

我解决这个问题的方法是创建一个全局的TestModule

代码语言:javascript
复制
    @Global()
    @Module({
      providers: [
        {
          provide: EmailService,
          useValue: {} // mock
        },
      ],
    })
    class TestModule {}

在测试模块开始时导入TestModule

代码语言:javascript
复制
    const module = await Test.createTestingModule({
      imports: [
        TestModule,
        AuthModule,
        // ...
      ]
    }).compile();

这样,EmailService是全局提供的,您不再需要导入EmailModule了。

全局模块被解释为这里

票数 2
EN

Stack Overflow用户

发布于 2021-10-03 17:31:33

您是否只是尝试在测试模块中提供EmailService?看起来会是这样的:

代码语言:javascript
复制
const module: TestingModule = await Test.createTestingModule({
  controllers: [AuthController],
  providers: [
    EmailService        
  ],
}).compile();

我认为您可以跳过导入整个EmailModule并提供所需的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60756629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档