如何在 NestJS 服务中测试猫鼬?

Posted

技术标签:

【中文标题】如何在 NestJS 服务中测试猫鼬?【英文标题】:How to test mongoose in NestJS Service? 【发布时间】:2019-12-22 00:12:58 【问题描述】:

我想从我的服务中测试getFund() 方法。我使用默认使用 jest 的 NestJS。 我不知道如何用玩笑来测试这条线:return await this.fundModel.findById(id);。有什么想法吗?

import  Injectable  from '@nestjs/common';
import  Model  from 'mongoose';
import  Fund  from '../../funds/interfaces/fund.interface';
import  InjectModel  from '@nestjs/mongoose';


@Injectable()
export class FundService 
  constructor(
    @InjectModel('Fund')
    private readonly fundModel: Model<Fund>,
  ) 

  /*****
    SOME MORE CODE
  ****/

  async getFund(id: string): Promise<Fund> 
    return await this.fundModel.findById(id);
  

编辑

感谢 slideshowp2 的回答,我写了这个测试。

describe('#getFund', () => 
    it('should return a Promise of Fund', async () => 
      let spy = jest.spyOn(service, 'getFund').mockImplementation(async () => 
        return await Promise.resolve(FundMock as Fund);
      );
      service.getFund('');
      expect(service.getFund).toHaveBeenCalled();
      expect(await service.getFund('')).toEqual(FundMock);
      spy.mockRestore();
    );
  );

问题是我在覆盖率报告中得到了这个结果:

当我悬停该行时,我得到statement not covered

【问题讨论】:

【参考方案1】:

您的getFund 方法中只有一个语句return await this.fundModel.findById(id);。没有其他代码逻辑,这意味着您可以进行的单元测试只是模拟 this.fundModel.findById(id) 方法和测试 它.toBeCalledWith(someId)

我们应该模拟每个方法并测试您的getFund 方法中的代码逻辑。目前,没有其他代码逻辑。

例如


 async getFund(id: string): Promise<Fund> 
    // we should mock this, because we should make an isolate environment for testing `getFund`
    const fundModel = await this.fundModel.findById(id); 
    // Below branch we should test based on your mock value: fundModel
    if(fundModel) 
      return true
    
    return false
  

更新

例如:

describe('#findById', () => 
    it('should find ad subscription by id correctly', async () => 
      (mockOpts.adSubscriptionDataSource.findById as jestMock).mockResolvedValueOnce( adSubscriptionId: 1 );
      const actualValue = await adSubscriptionService.findById(1);
      expect(actualValue).toEqual( adSubscriptionId: 1 );
      expect(mockOpts.adSubscriptionDataSource.findById).toBeCalledWith(1);
    );
  );

测试覆盖率报告:

【讨论】:

您好幻灯片p2。非常感谢您的回答。我尝试了你告诉我的内容,但我的报道报告中仍然出现错误。你知道为什么以及如何解决这个问题吗?

以上是关于如何在 NestJS 服务中测试猫鼬?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NestJS 测试猫鼬模型

使用@nestjs/mongoose 时如何在文档界面中定义静态猫鼬方法?

如何使用 NestJS 命名法为猫鼬写下嵌套模式 [关闭]

如何使用nestjs处理猫鼬错误

使用猫鼬和nestJS自动增加字段

如何在服务nestjs中模拟getMongoRepository