Я хочу использовать экземпляр Mongo в памяти для макетирования данных в целях тестирования в моем приложении NestJS. У меня есть поставщик базы данных, который подключается к моей производственной базе данных с помощью mongoose, который является частью моего модуля базы данных, который, в свою очередь, импортируется в другие модули.
Я пытаюсь переопределить поставщика базы данных в моих тестах Jest, чтобы я мог использовать экземпляр Mongo в памяти.
Это модуль базы данных:
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule { }
и база данных Provider:
export const databaseProviders = [
{
provide: 'DbConnectionToken',
useFactory: async (): Promise<typeof mongoose> =>
await mongoose.connect(PRODUCTION_DATABASE_URL),
},
];
У меня есть модуль Events, который импортирует и использует соединение с базой данных из модуля базы данных. Служба Events - это то, что я тестирую - beforeEach в моих events.spec.ts:
beforeEach(async () => {
const module = await Test.createTestingModule({
imports: [EventsModule],
providers: [
EventsService,
{
provide: 'EventModelToken',
useValue: EventSchema
},
],
}).compile();
eventService = module.get<EventsService>(EventsService);
});
Я попытался импортировать модуль DatabaseModule в модуль тестирования, а затем добавить своего собственного провайдера, предполагая, что он переопределит провайдера базы данных, но он не работает, как я ожидал, поэтому я боюсь, что я могу неправильно понять, как переопределяющие провайдеры работают в этом контексте.
Вот что я пытался:
beforeEach(async () => {
const module = await Test.createTestingModule({
imports: [EventsModule, DatabaseModule],
providers: [
EventsService,
{
provide: 'EventModelToken',
useValue: EventSchema
},
{
provide: 'DbConnectionToken',
useFactory: async (): Promise<typeof mongoose> =>
await mongoose.connect(IN_MEMORY_DB_URI),
},
],
}).compile();
eventService = module.get<EventsService>(EventsService);
});