[英]Jest mock nested functions of MongoDB
我有一個管理 MongoDB 客戶端方法的助手 class。
class Common {
constructor() {
this._client = null;
}
static async connect(url) {
this._client = await MongoClient.connect(url, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
return this._client;
}
static async getCollection({ url, db_name, collection_name }) {
const client = await Common.connect(url);
return client.db(db_name).collection(collection_name);
}
}
我正在嘗試為 getCollection 方法編寫測試用例。 這是我嘗試過的
jest.mock('mongodb');
it('To check if the collection method on the MongoClient instance was invoked', () => {
Common.getCollection({});
const mockMongoClientInstance = MongoClient.mock.instances[0];
const mockMongoDBConnect = mockMongoClientInstance.connect;
expect(mockMongoDBConnect).toHaveBeenCalledTimes(1);
});
顯然,這個測試用例覆蓋了getCollection方法的第一行,而測試用例實際上試圖執行第二行。 如何模擬第二行? 任何建議都會有所幫助。 提前致謝。
您可以使用jest.spyOn(object, methodName)來模擬Common.connect()
和MongoClient.connect()
方法。
例如
common.js
:
import { MongoClient } from 'mongodb';
export class Common {
constructor() {
this._client = null;
}
static async connect(url) {
this._client = await MongoClient.connect(url, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
return this._client;
}
static async getCollection({ url, db_name, collection_name }) {
const client = await Common.connect(url);
return client.db(db_name).collection(collection_name);
}
}
common.test.js
:
import { Common } from './common';
import { MongoClient } from 'mongodb';
describe('66848944', () => {
afterEach(() => {
jest.restoreAllMocks();
});
describe('#getCollection', () => {
it('To check if the collection method on the MongoClient instance was invoked', async () => {
const client = { db: jest.fn().mockReturnThis(), collection: jest.fn() };
const connectSpy = jest.spyOn(Common, 'connect').mockResolvedValueOnce(client);
await Common.getCollection({ url: 'mongodb://localhost:27017', db_name: 'awesome', collection_name: 'products' });
expect(connectSpy).toBeCalledWith('mongodb://localhost:27017');
expect(client.db).toBeCalledWith('awesome');
expect(client.collection).toBeCalledWith('products');
});
});
describe('#connect', () => {
it('should connect to mongo db', async () => {
const connectSpy = jest.spyOn(MongoClient, 'connect').mockReturnValueOnce({});
const actual = await Common.connect('mongodb://localhost:27017');
expect(actual).toEqual({});
expect(connectSpy).toBeCalledWith('mongodb://localhost:27017', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
});
});
});
單元測試結果:
PASS examples/66848944/common.test.js
66848944
#getCollection
✓ To check if the collection method on the MongoClient instance was invoked (5 ms)
#connect
✓ should connect to mongo db (1 ms)
-----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------
All files | 85.71 | 100 | 66.67 | 85.71 |
common.js | 85.71 | 100 | 66.67 | 85.71 | 5
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 5.165 s, estimated 6 s
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.