注入EntityManager的类中的单元测试功能

问题描述

我需要帮助将单元测试添加nestJs中的以下功能我有一个带有createOrder函数的类,如下所示。该类的构造函数将注入一个实体管理器。我如何在玩笑中测试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();
        });
      });
    });

解决方法

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

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

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

通过这种方法,您可以测试函数并检查save函数是否已使用正确的参数调用。