【问题标题】:Mocking a service in Unit Tests in Nestjs在 Nestjs 的单元测试中模拟服务
【发布时间】:2020-03-22 04:05:11
【问题描述】:

我有点关注这个视频:https://www.youtube.com/watch?v=w_7qA-33Kxg

我有 2 个服务,其中一个 (service1) 依赖于 service2。

我正在尝试为 service1 编写一个单元测试,其中我尝试使用自定义提供程序来模拟 service2,如下所示:

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        Service1,
        { provide: Service2, useFactory: mockService2 },
      ],
    }).compile();

    service1 = await module.get<Service1>(Service1);
    service2 = await module.get<Service2>(Service2);
  });

mockService2函数定义如下:

mockService2 = () => ({
  collectionGetQuery: jest.fn(),
  hello: jest.fn(),
});

但是,当我尝试在 collectionGetQuery 上调用 mockReturned(这应该是一个笑话函数)时,我得到一个未定义的函数类型(原始函数的类型)错误,我无法访问你好方法意味着服务没有被覆盖。

【问题讨论】:

  • 据我所知,您的设置看起来是正确的。如果没有看到错误(可能还有测试),可能很难看出哪里出了问题。如果您需要一些示例,尽管 you can find my testing repo here 有一堆不同的 NestJS 示例服务器测试
  • 如果将jest.fn() 替换为jest.fn().mockReturnValue(...) 会怎样?
  • 它仍然要求将发送到原始方法的参数。
  • 所以我还没有解决这个问题,但是我通过不使用测试模块并自己创建服务类并在参数中发送模拟的依赖项来解决这个问题。

标签: unit-testing testing jestjs nestjs


【解决方案1】:

你必须覆盖你的提供者并使用这样的东西:

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
  providers: [Service2],
}).overrideProvider(Service2).useFactory(mockService2).compile();
  service1 = await module.get<Service1>(Service1);
  service2 = await module.get<Service2>(Service2);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多