注入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函数是否已使用正确的参数调用。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...