[英]Jest mock nested functions of MongoDB
I have a helper class that manages the MongoDB client methods.我有一个管理 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);
}
}
I am trying to write the test case for the getCollection method.我正在尝试为 getCollection 方法编写测试用例。 This is what I tried
这是我尝试过的
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);
});
Obviously, this test case covers the first line of the getCollection method and the test case actually tries to execute the second line.显然,这个测试用例覆盖了getCollection方法的第一行,而测试用例实际上试图执行第二行。 How can I mock the second line?
如何模拟第二行? Any suggestion would be helpful.
任何建议都会有所帮助。 Thanks in advance.
提前致谢。
You can use jest.spyOn(object, methodName) to mock Common.connect()
and MongoClient.connect()
methods.您可以使用jest.spyOn(object, methodName)来模拟
Common.connect()
和MongoClient.connect()
方法。
Eg例如
common.js
: 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
: 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,
});
});
});
});
unit test result:单元测试结果:
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.