2017-04-08 106 views
0

玩笑嘲讽真是困惑我现在。玩笑嘲讽 - 简单的模拟

我有下面的代码在我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

发布一个答案,但想必你想这样做,因为你不希望mqttclient发布的通知。在这种情况下,为什么不使用mqttclient.publish呢? –

+0

正是。我试图嘲笑这个.publish,但现在有点超出了我的知识宝库。我以香草形式使用npm mqtt。我可以嘲笑.connect但后来这个被分配到mqttclient这反过来又返回与原型MqttClient功能.publish – munkee

+0

我觉得这个页面说明了什么,我需要做的https://facebook.github.io/jest/docs/manual- mocks.html我想我已经错过了将模拟放在mqtt node_modules文件夹旁边的使用方法 – munkee

回答

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模块通过module.exports.dispatcher电话dispatcher它只会工作。


相反,如果你不希望你的源文件中调用module.exports.dispatcher做的,是你必须拉出来dispatcher到它自己的模块,但嘲讽看起来应该非常相似。

./__mocks__/dispatcher.js

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

,并呼吁jest.mock('path/to/dispatcher.js')在您的测试。

+0

感谢您的参与并涵盖了场景2。当你说把这个拉出到另一个模块中时,你的意思只是为了模拟,还是你的意思是它是整个模块,当然这更容易模拟,因为它是单独的 – munkee

+0

跟随场景1,并通过module.exports.dispatcher调用。非常好的指导,谢谢。场景2的 – munkee

+0

,正如你所描述的。分开时更容易模拟。 –