如何用玩笑模拟node_module内部的构造函数?

时间:2018-09-19 06:00:51

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

笑话可以模拟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进行设置,以便模拟Requester模块中的cote的构造函数返回模拟对象,当您调用send时,该对象可以解决承诺?

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

1 个答案:

答案 0 :(得分:2)

首先在__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