如何开玩笑地模拟 node_module 中的构造函数?
How to mock constructor inside node_module with jest?
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
以便 Requester
的构造函数来自 mocked cote
模块 returns mocked object 在调用 send 时解析 promise?
编辑:
我在很多测试中都需要这种情况,每个 send(...
每个测试场景都应该 return 不同的承诺。
您首先在 __mocks__
中创建的模块的 "manual mock",然后使用 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
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
以便 Requester
的构造函数来自 mocked cote
模块 returns mocked object 在调用 send 时解析 promise?
编辑:
我在很多测试中都需要这种情况,每个 send(...
每个测试场景都应该 return 不同的承诺。
您首先在 __mocks__
中创建的模块的 "manual mock",然后使用 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