问题描述
我需要帮助将单元测试添加到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
函数是否已使用正确的参数调用。