Nest.js: инициализация свойства из суперкласса контроллера - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть вопрос, касающийся модульного тестирования контроллеров в среде 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 инициализировалось бы, и код работал.Но при запуске тестов кажется, что тестовый модуль не инициализирует его (поэтому он не определен).

Любая помощь очень ценится.

1 Ответ

1 голос
/ 24 сентября 2019

В каждом тесте перед каждым вам нужно запустить следующее

await module.init(); // this is where onModuleInit is called

Также лучше закрыть приложение

afterEach(async () => await module.close());
...