我正在尝试模拟knex调用,但是,我无法模拟所有的Promise树。 我的模拟如下:
jest.mock('../src/db/Client', () => {
const mKnex = {
select: jest.fn().mockReturnThis(),
then: jest.fn((done) => done([list with my data])),
catch: jest.fn(),
};
return jest.fn(() => mKnex);
});
我能够模拟select
和then
,但开玩笑地抱怨catch
不是一个函数,而且我对如何模拟它并使我的我的想法用光了测试通过。
有什么想法吗?
答案 0 :(得分:1)
就像@jonrsharpe所说的那样,您不需要模拟then
和catch
方法。
如果要测试成功的方案,则应使用mockResolvedValue方法,例如:db.select.mockResolvedValue(mResponse)
,then
方法。
如果要测试失败情况,则应使用mockRejectedValue方法,例如:db.select. mockRejectedValue(mError)
,catch
方法。
答案 1 :(得分:0)
jest.mock('../src/db/Client', () => {
const mKnex = {
select: jest.fn().mockResolvedValueOnce([{ key: 'blabla' }]).mockReturnThis(),
catch: jest.fn(),
};
return jest.fn(() => mKnex);
});
将代码更改为此可以解决捕获问题
答案 2 :(得分:0)
您可以使用 knex-mock-client
在测试环境中模拟您的数据库。
import { getTracker } from 'knex-mock-client';
jest.mock('../src/db/Client', () => {
const realKnex= require('knex');
const { MockClient } = require('knex-mock-client');
const mockedKnex = realKnex({
client: MockClient,
});
return { db: mockedKnex };
});
it('should query activities', async () => {
const trackId = 124;
tracker.on
.select(
(rawQuery) => rawQuery.sql.include('activities_table') && rawQuery.bindings.includes(trackId)
)
.responseOnce([{ id: 1 }, { id: 2 }]);
const results = await GetActivities({ trackId });
expect(results).toHaveLength(2);
});
欲了解更多详情,请查看:https://github.com/felixmosh/knex-mock-client。
完全公开,我是该库的作者。