Jest Mocking - 简单的模拟

时间:2017-04-08 04:51:19

标签: unit-testing jest

Jest嘲笑现在让我很困惑。

我在notifications.js模块中有以下代码:

// Dispatch notifications to MQTT end point
function dispatcher(shipment) {
  mqttclient.publish('notification', JSON.stringify(shipment));
  return console.info('Notification dispatched.');
}

我导出它以便它可用于我的测试:

module.exports = { notificationProcessor, notificationDispatch, dispatcher };

我希望在测试期间更改此函数的实现,以便不触发mqqtclient.publish事件。

我试图模仿整个mqtt npm模块,它也是该文件的一部分,但是它非常复杂,所以我从主代码中拆分了调度程序功能,所以我可以完全专注于它。

如果识别出通知,则从notificationProcessor调用

调度程序。在我的测试文件中,我只是向notificationProcessor提供一封电子邮件,然后将其发送给调度员。

如何模拟这个简单函数的实现?

1 个答案:

答案 0 :(得分:1)

您可以在不移除第一个模块中的dispatcher的情况下进行模拟,因为dispatcher是导出。

./__mocks__/notifications.js

中的

const notifications = require.requireActual('../notifications.js');

notifications.dispatcher = function(shipment) {
  // mock implementation
}

module.exports = notifications;

然后在您的测试中,您需要拨打jest.mock('path/to/notifications.js')

很简单,你在开玩笑说,无论何时需要notifications模块,都需要使用替换的调度程序函数实际加载原始模块的模拟并发送它。

现在有一个潜在的警告......在执行此操作时,您只需更改导出对象,因此仅当您的notifications模块通过{{1}调用dispatcher时它才有效}}

如果您不想在源文件中拨打module.exports.dispatcher,是的,您可以将module.exports.dispatcher拉入其自己的模块,但是嘲笑它应该看起来很相似。

dispatcher

中的

./__mocks__/dispatcher.js

并在测试中致电module.exports = function dispatcher(shipment) { // mock implementation }