Протестируйте сервис NestJs с помощью Jest

Я ищу способ протестировать свой NestJs PlayerController с помощью Jest. Мой контроллер и декларация службы:

import { QueryBus, CommandBus, EventBus } from '@nestjs/cqrs';

/**
 * The service assigned to query the database by means of commands
 */
@Injectable()
export class PlayerService {
    /**
     * Ctor
     * @param queryBus
     */
    constructor(
        private readonly queryBus: QueryBus,
        private readonly commandBus: CommandBus,
        private readonly eventBus: EventBus
    ) { }


@Controller('player')
@ApiUseTags('player')
export class PlayerController {
    /**
     * Ctor
     * @param playerService
     */
    constructor(private readonly playerService: PlayerService) { }

Мой тест:

describe('Player Controller', () => {
  let controller: PlayerController;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [PlayerService, CqrsModule],
      controllers: [PlayerController],
      providers: [
        PlayerService,
      ],
    }).compile();


    controller = module.get<PlayerController>(PlayerController);
  });

  it('should be defined', () => {
    expect(controller).toBeDefined();
  });
...

Nest can't resolve dependencies of the PlayerService (?, CommandBus, EventBus). Please make sure that the argument at index [0] is available in the PlayerService context.

  at Injector.lookupComponentInExports (../node_modules/@nestjs/core/injector/injector.js:180:19)

Есть ли способ обойти эту проблему зависимости?

Поведение ключевого слова "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) для оценки ваших знаний,...
3
0
6 323
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это не работает, потому что вы импортируете PlayerService. Вы можете импортировать только модули, провайдеры могут быть импортированы через модуль или объявлены в массиве providers:

imports: [PlayerService, CqrsModule]
          ^^^^^^^^^^^^^

Однако в модульном тесте вы хотите тестировать отдельные модули изолированно, а не взаимодействие между различными модулями и их зависимостями. Поэтому лучше, чем импортировать или объявлять ваши зависимости, предоставить макеты для PlayerService или поставщиков CqrsModule.

См. этот ответ для различия между модульными и e2e тестами.

См. этот ответ о том, как создавать макеты.

Это сработало для меня.

import { UserEntity } from './user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
const module = await Test.createTestingModule({
    controllers: [UsersController],
    providers: [UsersService],
    imports: [TypeOrmModule.forRoot(), TypeOrmModule.forFeature([UserEntity])], // <== This line
}).compile();

Это не имеет ничего общего с модулем TypeORM.

djheru 08.02.2022 07:42

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