如何在 NodeJS + Typescript 中模拟静态方法及其返回结果?

问题描述 投票:0回答:1

我正在学习使用 Jest 为 NodeJS + Typescript 编写单元测试用例。目前,我有一个非常简单的 Express 应用程序,其中存储库(通过

MongoConfig
自定义类与 MongoDB 连接)层有一些插入/选择数据的方法。以下是其中两个:

  export default class MyRepository {
    ...
    private _getCollection(collectionName: string): Collection {
      let collection = this._collections[collectionName];
      if (!collection) {
        collection = MongoConfig.getDatabase().collection(collectionName);
        this._collections[collectionName] = collection;
      }
      return collection;
    }

    public async insert(collectionName: string, dataToSave: any): Promise<void> {
      let collection = this._getCollection(collectionName);
      await collection.insertOne(dataToSave);
    }
    ...
  }

这里我想模拟

MongoConfig.getDatabase().collection(<any string>)
中的
_getCollection(..) method
方法调用并返回模拟的
Collection
对象。如何使用 Jest 来实现这一点?

此外,如果您能解释我们如何测试

insert(..)
方法,那就太好了。我们应该只检查该方法中是否调用了
await collection.insertOne(dataToSave)
吗?

node.js typescript unit-testing jestjs mocking
1个回答
0
投票
  • 在您的测试文件中导入
    MongoConfig
  • 在您的测试中创建一个具有模拟函数属性的对象。
  • 创建一个返回对象的模拟函数
    collection
  • 使用
  • jest.spyOn
     来模拟 
    MongoConfig.getDatabase
     让它返回模拟 
    collection
    
    
  • 对相关方法进行断言
import { MongoConfig } from 'mongodb' // Substitute with the proper import const collectionMethods = { insertOne: jest.fn(async () => {}) } const collection = jest.fn().mockReturnValue(collectionMethods); jest.spyOn(MongoConfig, 'getDatabase').mockReturnValue(collection); // Clear all mocks describe('insert', () => { it('works', async () => { const collectionName = 'foo'; const dataToSave = {}; const repo = new MyRepository(); await repo.insert(collectionName, dataToSave); expect(collection).toHaveBeenCalledWith(collectionName); expect(collectionMethods.insertOne).toHaveBeenCalledWith(dataToSave); }) })
如果您要在多个测试文件中重复此模式,请考虑为导出模拟的 mongodb 驱动程序创建一个

手动模拟


© www.soinside.com 2019 - 2024. All rights reserved.