如何开玩笑地模拟 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