【问题标题】:How to mock constructor inside node_module with jest?如何用玩笑模拟 node_module 内的构造函数?
【发布时间】:2018-09-19 06:00:51
【问题描述】:

Jest 可以选择模拟 node_module

jest.mock('module_name')

我要模拟的模块是cote 模块。 Here 是模块中的 index.js 文件。

里面有 Requester 的构造函数导出

const Requester = require('./components/requester');

...

cote.Requester = Requester;

...

module.exports = cote();

我在我的代码中访问这个文件是这样的:

const cote = require('cote');
const requester = new cote.Requester({name: 'findOnePlayer requester'});

...

const player = await requester.send({type:'findOnePlayer',username:username, password: password})

如何使用jest 进行设置,以便模拟cote 模块中的Requester 的构造函数返回模拟对象,该对象在您调用send 时解析承诺?

编辑: 我在很多测试中都需要这种情况,每个send(... 应该在每个测试场景中返回不同的promise。

【问题讨论】:

    标签: javascript node.js unit-testing jestjs cote


    【解决方案1】:

    您首先在 __mocks__ 中创建的模块的“手动模拟”,然后使用 jest.mock('moduleName') 导入到您的测试中,将允许您在代码中模拟 requester 对象。

    要在每次调用requester.send() 时生成不同的输出,可以使用模拟函数实现;即jest.fn() 和链接的jest.mockImplementationOnce() 调用。例如:

    const send = jest
      .fn(() => new Promise(resolve => resolve('foo')))
      .mockImplementationOnce(() => new Promise(resolve => resolve('bar')))
      .mockImplementationOnce(() => new Promise((resolve, reject) => reject()));
    

    当您在执行这个模拟的send() 函数的地方运行连续测试时,send() 返回的承诺将使用我们上面指定的值进行解析。有关详细信息,请在此处查看文档:

    手动模拟: https://jestjs.io/docs/en/manual-mocks

    模拟实现: https://jestjs.io/docs/en/mock-functions#mock-implementations

    【讨论】:

    • 使用request.send(在不同的测试中创建不同响应的方法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多