Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 开玩笑的模仿-简单的模仿_Unit Testing_Jestjs - Fatal编程技术网

Unit testing 开玩笑的模仿-简单的模仿

Unit testing 开玩笑的模仿-简单的模仿,unit-testing,jestjs,Unit Testing,Jestjs,玩笑式的嘲弄现在真让我困惑 我的notifications.js模块中有以下代码: // Dispatch notifications to MQTT end point function dispatcher(shipment) { mqttclient.publish('notification', JSON.stringify(shipment)); return console.info('Notification dispatched.'); } 我将其导出,以便可用于我的测

玩笑式的嘲弄现在真让我困惑

我的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模块,它也是该文件的一部分,但它涉及到很多问题,因此我从主代码中分离出了dispatcher函数,以便我可以将精力完全集中在这一点上

如果标识了通知,则从notificationProcessor调用dispatcher。在我的测试文件中,我只是向notificationProcessor提供一封电子邮件,该电子邮件经过解析后发送给调度员


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

您可以模拟它,而无需从第一个模块中删除
dispatcher
,因为
dispatcher
是一个导出

/\uuuuuu mocks\uuuuu/notifications.js中

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

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

module.exports = notifications;
module.exports = function dispatcher(shipment) {
  // mock implementation
}
然后在测试中,调用
jest.mock('path/to/notifications.js')

很简单,您告诉jest,无论何时需要
通知
模块,都需要mock,mock实际使用替换的dispatcher函数加载原始模块并发送该函数

现在有一个潜在的警告。。。在执行此操作时,您只需更改exports对象,因此只有当您的
通知
模块通过
module.exports.dispatcher
调用
dispatcher
时,它才会起作用


如果您不想在源文件中调用
module.exports.dispatcher
,那么可以将
dispatcher
拉出到它自己的模块中,但是模拟它应该看起来非常相似

/\uuuuuu mocks\uuuu/dispatcher.js中

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

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

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

并在测试中调用
jest.mock('path/to/dispatcher.js')

发布了答案,但您可能希望这样做,因为您不希望mqttclient发布通知。在这种情况下,为什么不模拟mqttclient.publish呢?没错。我试图模仿.publish,但现在我对它有点不了解。我使用的是普通格式的npmmqtt。我可以mock.connect,但是它被分配给mqttclient,mqttclient反过来会返回一个带有原型的mqttclient函数。Publish我想这一页解释了我需要做的事情,我想我错过了将mock放在mqtt节点_模块文件夹旁边的用法。感谢这一点,并介绍了场景2。当你说把它拉到另一个模块中时,你是说只是为了模拟还是说它是自己的模块整体,这当然更容易模拟,因为它是单独的,遵循场景1,只是通过module.exports.dispatcher调用。非常好的指导谢谢。对于场景2,正是您所描述的。当它分开时,更容易嘲笑。