У меня есть вопрос, касающийся модульного тестирования контроллеров в среде Nest.js.Проблема в том, что свойство суперкласса не инициализируется в классе контроллера при создании тестового модуля.
Это пример кода, о котором я говорю:
export class MyController extends SomeOtherController {
// Inherited from SomeOtherController
async initSomeObject() {
this.someObject = await initializeThisSomehow();
}
async controllerMethod(args: string) {
// Do something
}
}
export abstract class SomeOtherController implements OnModuleInit {
protected someObject: SomeObject;
async onModuleInit() {
await this.initSomeObject();
}
abstract async initSomeObject(): Promise<void>;
}
И вот какЯ создал свой тест
describe('MyController', () => {
let module: TestingModule;
let controller: MyController;
let service: MyService;
beforeEach(async () => {
module = await Test.createTestingModule({
imports: [],
controllers: [MyController],
providers: [
MyService,
{
provide: MyService,
useFactory: () => ({
controllerMethod: jest.fn(() => Promise.resolve()),
}),
},
],
}).compile();
controller = module.get(MyController);
service = module.get(MyService);
});
describe('controller method', () => {
it('should do something', async () => {
jest.spyOn(service, 'controllerMethod').mockImplementation(async _ => mockResult);
expect(await controller.controllerMethod(mockArgs)).toBe(mockResult);
});
});
});
Теперь, если бы я запускал приложение в режиме разработки, свойство someObject
инициализировалось бы, и код работал.Но при запуске тестов кажется, что тестовый модуль не инициализирует его (поэтому он не определен).
Любая помощь очень ценится.