【问题标题】:Unit testing function in a class that injects EntityManager注入EntityManager的类中的单元测试功能
【发布时间】:2020-12-06 14:27:14
【问题描述】:

我需要帮助将单元测试添加到 NestJs 中的以下函数。 我有一个带有 createOrder 函数的类,如下所示。类的构造函数注入一个实体管理器。如何在 jest 中测试 createOrder 函数。

    import { Injectable } from '@nestjs/common';
    import * as shortId from 'shortid';
    import { EntityManager, Repository } from 'typeorm';
    import { HttpException, HttpStatus } from '@nestjs/common';

    import { Service } from 'models/service.model';
    
    @Injectable()
    export class OrderService {
      private readonly orderRepository: Repository<Service>;
    
      constructor(private readonly entityManager: EntityManager) {
        this.orderRepository = entityManager.getRepository(Service);
      }
    
      async createOrder(data) {
        const orderService = new Service();

        orderService.id = shortId.generate(); // just to generate a string for id
    
        const orderServiceData = Object.assign(orderService, data);
    
        try {
          
          await this.orderRepository.save(orderServiceData);
          
          return { success: true };
        } catch (err) {
          throw new HttpException('Post not found', HttpStatus.NOT_FOUND);
        }
      }
    }

这是我迄今为止尝试过的。但是调用保存函数失败

    import { Test, TestingModule } from '@nestjs/testing';
    import { OrderService } from './order_service.service';
    import { Service } from '../../models/service.model';
    import { Repository, EntityManager, getRepository } from 'typeorm';
    import { getRepositoryToken } from '@nestjs/typeorm';
    
    describe('Order Service', () => {
      let orderService: OrderServiceService;
      let orderRepository: Repository<Service>;
    
      const mockOrderRepository = () => ({
        save: jest.fn(),
      });
    
      const mockEntityManager = () => ({
        getRepository: jest.fn(),
      });
    
      beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
          providers: [
            OrderService,
            {
              provide: EntityManager,
              useFactory: mockEntityManager,
            },
            {
              provide: getRepositoryToken(Service),
              useFactory: mockOrderRepository,
            },
          ],
        }).compile();
    
        orderService = await module.get<OrderService>(
          OrderService,
        );
        orderRepository = await module.get(getRepositoryToken(Service));
      });
    
      it('should check that order service is defined', () => {
        expect(orderService).toBeDefined();
      });
    
      describe('Create order service', () => {
        it('should create an order service', () => {
          expect(orderRepository.save).not.toHaveBeenCalled();
          const data = {
            name: 'Gucci Cloths',
            type: 'Cloths',
          };
    
          orderService.createOrder(data);
          expect(orderRepository.save).toHaveBeenCalled();
        });
      });
    });

【问题讨论】:

  • 是否有特殊原因需要注入EntityManager 而不是仅仅注入Repository&lt;Service&gt;?直接针对 repo 模拟功能会更容易
  • @JesseCarter 似乎还有在课堂上其他地方使用的其他好处。虽然,与此功能无关。

标签: unit-testing jestjs nestjs entitymanager typeorm


【解决方案1】:

你可以做的是模拟orderRepository的保存功能:

const mockRepository = {
  save: jest.fn(),
}

const mockEntityManager = () => ({
  getRepository: () => mockRepository,
});

这样您可以测试函数并检查save 函数是否已使用正确的参数调用。

【讨论】:

  • 如果我这样做,它会抱怨entityManager.getRepository is not a function
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多