如何使用玩笑嘲笑Knex Promise

时间:2020-05-26 19:09:23

标签: node.js unit-testing mocking jestjs knex.js

我正在尝试模拟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);
});

我能够模拟selectthen,但开玩笑地抱怨catch不是一个函数,而且我对如何模拟它并使我的我的想法用光了测试通过。 enter image description here

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

就像@jonrsharpe所说的那样,您不需要模拟thencatch方法。

如果要测试成功的方案,则应使用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

完全公开,我是该库的作者。