笑话可以模拟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。
答案 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