Как написать модульные тесты для метода с помощью декоратора @Transaction()?

#javascript #node.js #unit-testing #nestjs #typeorm

#javascript #node.js #модульное тестирование #nestjs #typeorm

Вопрос:

У меня есть сервис на NestJS 6. Я использую TypeORM для работы с MySQL.

Когда я пытаюсь написать модульные тесты для метода с помощью @Transaction() и @TransactionManager() декораторов, я получаю ошибку: ConnectionNotFoundError: Connection "default" was not found. .

 @Put(':id')
@Transaction()
update(
  @Body() someData: SomeDto,
  @Param('id') id: number,
  @UserDecorator() user: User,
  @TransactionManager() manager: EntityManager,
) {
  return this.someService.update(id, someData, user, manager);
}
  

Мой тест:

 beforeEach(async () => {
  manager = new EntityManager(null);
  someService = new SomeService();
  someController = new SomeController(someService);
});

describe('update', () => {
  it('should update', async () => {
    jest.spyOn(someService, 'update').mockResolvedValue(result);

    await expect(await someController.update(someData, 1, user, manager)).toBe(result);
    expect(someService.update).toBeCalledWith(1, someDto, user, manager);
  });
});
  

Есть ли лучший способ для записи и тестирования?

Комментарии:

1. Можете ли вы добавить свой модульный тест?

2. Ничего особенного. Я обновил свой вопрос.

3. @Transaction Подобное использование typeorm противоречит nest DI и, следовательно, затрудняет тестирование, см. Этот выпуск: github.com/nestjs/typeorm/issues/57 Скоро появятся официальные документы о том, как выполнять транзакции в nest.

Ответ №1:

Подобное использование @Transaction от typeorm противоречит DI от nest и, следовательно, затрудняет тестирование, см. Этот выпуск: github.com/nestjs/typeorm/issues/57 Скоро появятся официальные документы о том, как выполнять транзакции в nest.

Приведенное выше предложение Ким Керн сработало для меня. Я заменил @Transaction на connection.transaction(cb) , как рекомендовано NestJS docs, и теперь я мог правильно издеваться над материалом TypeORM и тестировать изолированно.