在 nest.js e2e 测试中覆盖单个测试中的提供商

Override provider in single test in nest.js e2e testing

我对带有控制器和一些提供商的模块进行了端到端测试:

beforeAll(async () => {
    const moduleRef = await Test.createTestingModule({
      controllers: [TestController],
      providers: [
        TestService,
        {
          provide: getRepositoryToken(TestEntity),
          useValue: {
            find: jest.fn(async () => testDatabaseResult),
            save: jest.fn(),
          },
        },
      ],
    }).compile();

    app = moduleRef.createNestApplication();
    app.use(cookieParser());
    app.useGlobalPipes(new ValidationPipe());

    await app.init();
  });

我在这里通过模拟 TestEntity 存储库来模拟数据库连接,它工作正常 - 服务的实际实现获得模拟的数据库查询结果。但是,在一个测试中,我需要 TestEntity 提供程序使用具有不同实现的模拟查找函数:

find: jest.fn(async () => otherMockedTestDatabaseResult)

我怎样才能做到这一点?我想使用 TestService 的真实实现,它在幕后使用模拟的 TestEntity 存储库(我不想使用测试数据库)。预先感谢您的帮助。

好的,我找到了,我会 post 在这里回答只是为了记录,以防万一有人遇到类似的问题,因为它没有在 Nest 文档中描述(或者我找不到它)。

当您从测试模块创建测试模块和应用程序实例时,应用程序对象具有可用于检索提供程序的解析方法:

it('/test', async () => {
    const testRepository = await app.resolve(getRepositoryToken(TestEvent));

    testRepository.find = jest.fn(() => []);

    return request(<...>).expect(<...>);
  });

const testRepository = moduleRef.get( getRepositoryToken(TestEvent) );

读这个:https://docs.nestjs.com/fundamentals/testing#testing-utilities