javascript - 如何用 Jest 模拟node_module内部的构造函数?

标签 javascript node.js unit-testing jestjs cote

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时解析 promise ?

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

最佳答案

您首先在 __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() 返回的 promise 将使用我们上面指定的值进行解析。有关更多详细信息,请查看此处的文档:

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

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

关于javascript - 如何用 Jest 模拟node_module内部的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52399114/

相关文章:

javascript - Javascript中如何确定函数参数?

javascript - js全屏切换按钮进入全屏但不会退出

node.js - 如何仅安装 "build"或 "dist"或通过 npm 输出库的结果

javascript - Node.js 并与 Pidgin 等 native 聊天交互?

C#:如何实例化私有(private)内部类列表?

c - 如何导致sqlite3_initialize失败

javascript - Mailchimp API 出错,无法使用 ajax 成功

javascript - 单击下一步时将 div 保存为图像

javascript - Puppeteer 获取所有 <a> href 链接

c# - 还有另一种方法可以在 mvc 中对业务逻辑进行单元测试