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

У меня есть сервис на 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);
  });
});

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

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

Kim Kern 09.04.2019 14:27

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

Sergey Krivochenko 09.04.2019 14:34

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

Kim Kern 10.04.2019 09:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
2 427
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Using typeorm's @Transaction like this goes against nest's DI and hence makes testing very hard, see this issue: github.com/nestjs/typeorm/issues/57 Official docs on how to do transactions in nest will follow soon.

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

Другие вопросы по теме