【问题标题】:Not able to cover complete service.ts in nestjs project无法覆盖nestjs项目中的完整service.ts
【发布时间】:2021-06-07 19:34:37
【问题描述】:

我有nestjs members.service.ts 文件

import { HttpException, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { FinanceMemberDocument } from './members.schema';
import { Model } from 'mongoose';
import { MemberType } from './members.types';
import { MemberDto } from './dto/members.dto';

@Injectable()
export class MembersService {
  constructor(
    @InjectModel('finance_members')
    private readonly financeMembersModel: Model<FinanceMemberDocument>,
  ) {}

  async getMemberDetails(memberGuid: string): Promise<MemberDto> {
    try{
      const memberArray = await this.financeMembersModel
        .find({ guid: memberGuid })
        .sort({ _id: -1 })
        .limit(1);
      return memberArray[0];
    }
    catch (err) {
      throw new HttpException({ ...err }, err?.response?.status);
    }
  }
}

这是我的 members.service.spec.ts 文件

import { Test, TestingModule } from '@nestjs/testing';
import { MembersService } from './members.service';
import { MemberType } from './members.types';
import { memberData } from './mockMembersData';

class MemberServiceMock {
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  getMemberDetails(_memberId: string) {
    return memberData;
  }
}

describe('MembersService', () => {
  let membersService: MembersService;

  beforeAll(async () => {
    const ApiServiceProvider = {
      provide: MembersService,
      useClass: MemberServiceMock,
    };
    const module: TestingModule = await Test.createTestingModule({
      providers: [MembersService, ApiServiceProvider],
    }).compile();
    membersService = await module.get<MembersService>(MembersService);
  });

  it('should is defined', () => {
    expect(membersService).toBeDefined();
  });

  it('is not null', () => {
    expect(typeof membersService.getMemberDetails).not.toBeNull();
  });

  it('should get data', async () => {
    try{
    const data = await membersService.getMemberDetails('123');
    expect(data).toEqual(memberData);
    }
    catch(e) {
      console.log(e)
    }
  });
  

  it('empty member detail', async () => {
    await expect(membersService.getMemberDetails('123')).toMatchObject({});
  });
});

这是我开玩笑的 lcov HTML 报告

我尝试了很多方法,但无法涵盖完整的服务文件。有什么方法可以涵盖 service.ts 文件中的所有内容吗? 请帮我覆盖我的服务代码至少 80%

提前致谢

【问题讨论】:

    标签: node.js typescript nestjs


    【解决方案1】:

    如果您想测试/覆盖MemberService,并且您不应该通过提供MemberServiceMock 来模拟它。相反,您应该模拟服务的依赖项,在本例中为 financeMembersModel

    请注意,如果您不想自己编写模拟程序,可以使用一个用于模拟猫鼬模型的库 -> https://www.npmjs.com/package/mockingoose

    【讨论】:

    • @user562451:有什么反馈吗?
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2020-08-13
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多