单元测试Nestjs猫鼬服务 [英] Unit Testing Nestjs Mongoose services

查看:89
本文介绍了单元测试Nestjs猫鼬服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试找出如何对NestJS服务进行单元测试. 因此,我写了一个规范文件来测试这些NestJS服务,这些服务使用jest来使用猫鼬.

I've been trying to figure out how to unit test services NestJS. So I wrote a spec file which tests these NestJS services which use mongoose using jest.

规格文件如下:

import { Test, TestingModule } from '@nestjs/testing';
import { EventsService } from './events.service';
import { getModelToken } from '@nestjs/mongoose';
import { CreateEventDto } from './dto/create-event.dto';

const event = {
  _id: '53d53d2s',
  name: 'Event Name',
  description: 'Description of the event.',
  min_team_size: 0,
  max_team_size: 4,
  event_price: 300,
};

describe('EventsService', () => {
  let service: EventsService;
  const eventModel = {
    save: jest.fn().mockResolvedValue(event),
    find: jest.fn().mockResolvedValue([event]),
    findOne: jest.fn().mockResolvedValue(event),
    findOneAndUpdate: jest.fn().mockResolvedValue(event),
    deleteOne: jest.fn().mockResolvedValue(true),
  };
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        EventsService,
        {
          provide: getModelToken('Event'),
          useValue: eventModel,
        },
      ],
    }).compile();

    service = module.get<EventsService>(EventsService);
  });

  it('should return all the events', () => {
    expect(service.findAll()).resolves.toEqual([event]).catch( err => {
      console.log(err);
    });
  });
  it('should create a new event and save it', () => {
    expect(service.create({
      name: event.name,
      description: event.description,
      event_price: event.event_price,
      max_team_size: event.max_team_size,
      min_team_size: event.min_team_size
    } as CreateEventDto )).resolves.toEqual(event).catch(err => {
      console.log(err);
    });
  });
  it('should return one event', () => {
    expect(service.findOne('53d53d2s')).resolves.toEqual(event).catch(err => {
      console.log(err);
    });
  });
  it('should find and update one model', () => {
    expect(service.findOneAndUpdate('53d53d2s', {} as any)).resolves.toEqual(event).catch( err => {
      console.log(err);
    });
  });
  it('should delete one model', () => {
    expect(service.deleteOne('53d53d2s')).resolves.toBeTruthy().catch( err => {
      console.log(err);
    });
  });
});

这是服务文件:

import { Injectable } from '@nestjs/common';
import { Model } from 'mongoose';
import { CreateEventDto } from './dto/create-event.dto';
import { EventInterface } from './interfaces/event.interface';
import { InjectModel } from '@nestjs/mongoose';

@Injectable()
export class EventsService {
  constructor(@InjectModel('Event') private readonly eventModel: Model<EventInterface>) {}

  async create(createEventDto: CreateEventDto): Promise<EventInterface> {
    const createdEvent = new this.eventModel(createEventDto);
    return createdEvent.save();
  }

  async findAll(): Promise<EventInterface[]> {
    return this.eventModel.find();
  }

  async findOne(id): Promise<EventInterface> {
    return this.eventModel.findOne({ _id: id });
  }

  async findOneAndUpdate(id, createEventDTO: CreateEventDto): Promise<EventInterface> {
    return this.eventModel.findOneAndUpdate({ _id: id }, createEventDTO);
  }
  async deleteOne(id): Promise<any> {
    return this.eventModel.deleteOne({ _id: id});
  }
}

除了create(),这里所有测试均成功通过.它显示以下错误: `{错误:expect(receives).resolves.toEqual()

Here all tests past successfully except the create(). It shows the following error: ` { Error: expect(received).resolves.toEqual()

  Received promise rejected instead of resolved
  Rejected to value: [TypeError: this.eventModel is not a constructor]
      at expect (/home/rakesh/SJPUC/Equinox-2019/equinox-api/node_modules/expect/build/index.js:138:15)
      at Object.it (/home/rakesh/SJPUC/Equinox-2019/equinox-api/src/events/events.service.spec.ts:44:5)
      at Object.asyncJestTest (/home/rakesh/SJPUC/Equinox-2019/equinox-api/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:102:37)
      at resolve (/home/rakesh/SJPUC/Equinox-2019/equinox-api/node_modules/jest-jasmine2/build/queueRunner.js:43:12)
      at new Promise (<anonymous>)
      at mapper (/home/rakesh/SJPUC/Equinox-2019/equinox-api/node_modules/jest-jasmine2/build/queueRunner.js:26:19)
      at promise.then (/home/rakesh/SJPUC/Equinox-2019/equinox-api/node_modules/jest-jasmine2/build/queueRunner.js:73:41)
      at process._tickCallback (internal/process/next_tick.js:68:7)
    matcherResult: undefined,
    message:
     '\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mresolves\u001b[2m.\u001b[22mtoEqual\u001b[2m()\u001b[22m\n\nReceived promise rejected instead of resolved\nRejected to value: \u001b[31m[TypeError: this.eventModel is not a constructor]\u001b[39m' }

`

我该如何解决? 另外,我想知道一种更好的方法来对这些服务进行单元测试.

How do I have fix this?? Also, I would like to know a better way to unit test these services.

推荐答案

问题是,NesjJS会将您在测试文件中定义的eventModel对象注入到EventService中.由于它是一个对象,因此没有构造函数. 您可以通过这样的类来代替对象:

The problem is, NesjJS will inject the eventModel object that you defined in the test file, into the EventService. Since it's an object, it doesn't have a constructor. Instead of an object, you can pass a class like this:

class EventModel {
  constructor(private data) {}
  save = jest.fn().mockResolvedValue(this.data);
  static find = jest.fn().mockResolvedValue([event]);
  static findOne = jest.fn().mockResolvedValue(event);
  static findOneAndUpdate = jest.fn().mockResolvedValue(event);
  static deleteOne = jest.fn().mockResolvedValue(true);
}

describe('EventsService', () => {
  let service: EventsService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        EventsService,
        {
          provide: getModelToken('Event'),
          useValue: EventModel,
        },
      ],
    }).compile();

   ...

这篇关于单元测试Nestjs猫鼬服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆