在 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
我对带有控制器和一些提供商的模块进行了端到端测试:
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