NestJs - Jest - Тестирование: ConnectionNotFoundError: Соединение «по умолчанию» не найдено - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь написать тест простого приложения TODO.

Это мой класс тестирования сервиса:


    const mockTaskRepository = () => ({
        createTask: jest.fn(),
    });

    describe('TasksService', () => {
        let tasksService;
        let taskRepository;

      beforeEach(async () => {
            const module = await Test.createTestingModule({
                providers: [TasksService, { provide: TaskRepository, useFactory: mockTaskRepository }],
            }).compile();

            tasksService = await module.get<TasksService>(TasksService);
            taskRepository = await module.get<TaskRepository>(TaskRepository);
        });

      describe('create task', () => {
            it('calls taskRepository.create() and returns the result', async () => {
                const createTaskDto = {
                    title: 'Test task',
                    description: 'Test desc',
                };
                taskRepository.createTask.mockResolvedValue('someTask');
                expect(taskRepository.createTask).not.toHaveBeenCalled();
                const result = await tasksService.createTask(createTaskDto);
                expect(taskRepository.createTask).toHaveBeenCalledWith(createTaskDto);
                expect(result).toEqual('someValue');
            });
        });
    });

И это мой сервис задач:


@Injectable()
export class TasksService {
    constructor(
        @InjectRepository(TaskRepository)
        private taskRepository: TaskRepository,
    ) {}

    async createTask(createTaskDto: CreateTaskDto): Promise<Task> {
        const { title, description } = createTaskDto;
        const task = new Task();
        task.title = title;

        task.description = description;
        task.status = TaskStatus.IN_PROGRESS;
        await task.save();

        return task;
    }
}

Когда я пытаюсь запустить тест Create a Task, возникает ошибка, приведенная ниже.

FAIL  src/tasks/tasks.service.spec.ts
  ● TasksService › create task › calls taskRepository.create() and returns the result

    ConnectionNotFoundError: Connection "default" was not found.

      at new ConnectionNotFoundError (error/ConnectionNotFoundError.ts:8:9)
      at ConnectionManager.Object.<anonymous>.ConnectionManager.get (connection/ConnectionManager.ts:40:19)
      at Object.getConnection (index.ts:247:35)
      at Function.Object.<anonymous>.BaseEntity.getRepository (repository/BaseEntity.ts:85:72)
      at Task.Object.<anonymous>.BaseEntity.save (repository/BaseEntity.ts:50:42)
      at TasksService.createTask (tasks/tasks.service.ts:35:14)
      at Object.<anonymous> (tasks/tasks.service.spec.ts:69:38)

Test Suites: 1 failed, 1 passed, 2 total
Tests:       1 failed, 8 passed, 9 total

Кто-нибудь знает, в чем заключается ошибка в коде?

...... ....................................

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Вы должны смоделировать хранилище, а затем вызвать контекст тестового модуля. В противном случае реальный репозиторий вводится (через DI Nest) в сервис.

            const module = await Test.createTestingModule({
                providers: [
                {
                      provide: getRepositoryToken(YourEntityClass),
                      useValue: mockedRepo, // or use class
                }, 
                TasksService],
            }).compile();

            tasksService = await module.get<TasksService>(TasksService);
            // taskRepository = await module.get<TaskRepository>(TaskRepository); don't have to do that if `useValue` was used instead of factory

Итак, TL; DR: provide: TaskRepository должен обеспечить Token данного Injectable в этом случае: https://docs.nestjs.com/fundamentals/custom-providers#non-class-based-provider-tokens

0 голосов
/ 21 октября 2019

Тест ожидал вызова метода Repository.createTask, но метод Service.createTask не выполнял этот вызов.

Исправление : обновление Сервисного метода делегировать методу Repository создание задачи.

// tasks.service.ts

async createTask(createTaskDto: CreateTaskDto, user: User): Promise<Task> {
        return this.taskRepository.createTask(createTaskDto, user);
}
// tasks.repository.ts

async createTask(createTaskDto: CreateTaskDto, user: User): Promise<Task> {
        const { title, description } = createTaskDto;
        const task = new Task();
        task.title = title;
        task.user = user;
        task.description = description;
        task.status = TaskStatus.IN_PROGRESS;
        await task.save();
        delete task.user;

        return task;
    }
}
0 голосов
/ 17 октября 2019

Если он ищет соединение default, тогда я предполагаю, что настройки TypeOrmModule все еще принимаются во внимание. Вместо provide: TaskRepository попробуйте изменить его на provide: getRepositoryToken(TaskEntity), если у вас есть TaskEntity. Это скажет Nest переопределить репозиторий по умолчанию, который пытается предоставить декоратор @InjectRepository().

Если это не так, думаете, вы могли бы добавить свои классы TaskService и TaskModule

...