【问题标题】:NestJs - Jest - Testing: ConnectionNotFoundError: Connection "default" was not foundNestJs - Jest - 测试:ConnectionNotFoundError:找不到连接“默认”
【发布时间】:2020-02-13 19:42:58
【问题描述】:

我正在尝试编写一个简单的 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;
    }
}

当我尝试运行创建任务测试时,出现以下错误。

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

有人知道代码中有什么错误吗?

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

提前致谢!

【问题讨论】:

    标签: testing jestjs tdd nestjs typeorm


    【解决方案1】:

    如果它正在寻找连接default,那么我假设 TypeOrmModule 配置仍在考虑中。如果您有 TaskEntity,请尝试将其更改为 provide: getRepositoryToken(TaskEntity),而不是 provide: TaskRepository。这将告诉 Nest 覆盖 @InjectRepository() 装饰器尝试提供的默认存储库。

    如果不是这样,你认为你可以添加你的 TaskServiceTaskModule 类吗?

    【讨论】:

    • 此更改无效。错误仍然存​​在。按照您的要求,我用 TaskModule 和 TaskService 更新了描述。
    【解决方案2】:

    您应该模拟存储库,然后调出测试模块的上下文。否则,将(通过 Nest 的 DI)将真正的 Repository 注入到服务中。

                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 应该提供给定 Injectable 的 Tokenhttps://docs.nestjs.com/fundamentals/custom-providers#non-class-based-provider-tokens

    【讨论】:

      【解决方案3】:

      测试预期方法 Repository.createTask 将被调用,但方法 Service.createTask 没有进行该调用。

      修复:更新 Service 方法,将任务创建委托给 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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 2021-08-03
        • 2020-04-25
        • 1970-01-01
        • 2021-08-04
        • 2019-09-08
        • 2022-01-06
        相关资源
        最近更新 更多