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提供一封电子邮件,然后将其发送给调度员。
如何模拟这个简单函数的实现?
答案 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
}
。