使用Nest.js测试时,如何针对不同场景多次使用Override Provider?

How can I use Override Provider multiple times for different scenarios when using Nest.js to test?

我正在尝试使用 Nest.js(和 Jest)对文件进行单元测试,如下所示:

import { Test, TestingModule } from '@nestjs/testing';

import { MyService } from 'myService';
import { DependencyService } from 'dependencyService';

describe('#mainMethod', () => {
  let myService, dependencyService;

  beforeAll(async () => {
    let mockDependencyService = {
      method1: jest.fn(() => true)
    };

    const module: TestingModule = await Test.createTestingModule({
        providers: [
            MyService,
            DependencyService,
        ]
      })
        .overrideProvider(DependencyService).useValue(mockDependencyService)
        .compile();
  
      myService = module.get<MyService>(MyService);
      dependencyService = module.get<DependencyService>(DependencyService);
  });

  it('should be ok', () => {
    // any test
  })
});

当这样写时,我能够测试 method1 from DependencyService returns true.

的场景

测试来自 method1 的不同响应的最佳方法是什么?我是否应该将其全部包装在 BeforeEach 中,创建另一个 describe 块,更改 mockDependencyService.method1 的 return,然后重新创建模块?有更好的方法吗?

谢谢!

我可能会像这样模拟模块作为一个普通函数:

let mockDependencyService = {
  method1: () => true
};

然后监视每个测试的实例:

jest.spyOn(myService, 'method1').mockReturnValue(false)
myService.method1()

// useless expectation for demo purposes
expect(myService.method1).toHaveBeenCalled()

这让您可以根据每个测试的需要为每个测试准备起始环境。