我正在学习使用 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)
吗?
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 驱动程序创建一个