jest.mock() 将模拟具有自动模拟版本的模块,factory 和 options 是可选的。
您可以使用mockFn.mockReturnThis() 来模拟方法链接调用。
另外,如果你在模块作用域内初始化Knex,你需要在mock建立后require模块。
例如
index.js:
import Knex from 'knex';
const knex = Knex({ client: 'mysql' });
export function main() {
const query = knex('table_name')
.where({
title: 'xxx-yyy',
lang: 'eng',
})
.select()
.orderBy('date', 'desc')
.toSQL()
.toNative();
}
index.test.js:
import Knex from 'knex';
jest.mock('knex');
describe('68717941', () => {
test('should pass', () => {
const querybuilder = {
where: jest.fn().mockReturnThis(),
select: jest.fn().mockReturnThis(),
orderBy: jest.fn().mockReturnThis(),
toSQL: jest.fn().mockReturnThis(),
toNative: jest.fn(),
};
const mKnex = jest.fn().mockReturnValue(querybuilder);
Knex.mockReturnValue(mKnex);
const { main } = require('./');
main();
expect(Knex).toBeCalledWith({ client: 'mysql' });
expect(mKnex).toBeCalledWith('table_name');
expect(querybuilder.where).toBeCalledWith({ title: 'xxx-yyy', lang: 'eng' });
expect(querybuilder.select).toBeCalledTimes(1);
expect(querybuilder.orderBy).toBeCalledWith('date', 'desc');
expect(querybuilder.toSQL).toBeCalledTimes(1);
expect(querybuilder.toNative).toBeCalledTimes(1);
});
});
测试结果:
PASS examples/68717941/index.test.js (8.844 s)
68717941
✓ should pass (7464 ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
index.js | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 9.439 s