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/