У меня есть сервис на 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);
});
});
Есть ли лучший способ написать и протестировать его?
Ничего особенного. Я обновил свой вопрос.
Использование typeorm @Transaction
таким образом противоречит DI гнезда и, следовательно, делает тестирование очень сложным, см. этот выпуск: github.com/nestjs/typeorm/issues/57 Официальные документы о том, как выполнять транзакции в гнезде, скоро появятся.
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 и тестировать изолированно.
Можете ли вы добавить свой модульный тест?