【问题标题】:How to mock knex promise using jest如何使用 jest 模拟 knex 承诺
【发布时间】:2020-05-26 19:09:23
【问题描述】:

我正在尝试模拟 knex 调用,但是,我无法模拟所有的承诺树。 我的模拟如下:

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 不是一个函数,我对如何模拟它并让我的测试通过的想法已经不多了。

有什么想法吗?

【问题讨论】:

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


【解决方案1】:

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

如果你想测试成功的场景,你应该像这样使用mockResolvedValue方法:db.select.mockResolvedValue(mResponse)then方法将被执行。

如果你想测试失败的场景,你应该像这样使用mockRejectedValue方法:db.select. mockRejectedValue(mError)catch方法会被执行。

【讨论】:

    【解决方案2】:
    jest.mock('../src/db/Client', () => {
      const mKnex = {
         select: jest.fn().mockResolvedValueOnce([{ key: 'blabla' }]).mockReturnThis(),
         catch: jest.fn(),
      };
      return jest.fn(() => mKnex);
    });
    

    把你的代码改成这个可以解决catch问题

    【讨论】:

      【解决方案3】:

      您可以使用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

      完全披露,我是该库的作者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-04
        • 2020-10-07
        • 1970-01-01
        • 2017-02-26
        • 2014-05-22
        • 2017-09-04
        • 1970-01-01
        • 2021-08-18
        相关资源
        最近更新 更多