2017-04-08 7 views
0

Jest Spott ist wirklich verwirrend mich jetzt.Jest Mocking - Einfacher Mock

Ich habe den folgenden Code in meinem notifications.js Modul:

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

exportiere ich das so ist es für meine Tests zur Verfügung:

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

Ich möchte die Implementierung dieser Funktion ändern während meiner Tests, so dass das mqqtclient.publish -Ereignis nicht ausgelöst wird.

Ich habe versucht, das gesamte mqtt npm-Modul zu verhöhnen, das auch Teil dieser Datei ist, aber es wird ziemlich beteiligt, also habe ich die Dispatcher-Funktion von meinem Hauptcode getrennt, damit ich mich darauf konzentrieren konnte.

Dispatcher wird von notificationProcessor aufgerufen, wenn eine Benachrichtigung identifiziert wird. In meiner Testdatei gebe ich dem notificationProcessor einfach eine E-Mail, die geparst und dann an den Dispatcher ausgegeben wird.

Wie gehe ich über die Umsetzung dieser einfachen Funktion spotten?

+0

hat eine Antwort gepostet, aber vermutlich möchten Sie dies tun, weil Sie nicht möchten, dass der mqttclient eine Benachrichtigung veröffentlicht. Warum verspotten Sie in diesem Fall nicht stattdessen mqttclient.publish? –

+0

Yeap genau. Ich habe versucht, das .publish zu verspotten, aber es war ein wenig jenseits meines Wissens. Ich verwende npm mqtt im Vanilla-Format. Ich kann mock.connect, aber dann wird dies zu mqttclient zugeordnet, die wiederum eine MqttClient-Funktion mit dem Prototyp. Publish – munkee

+0

Ich denke, diese Seite erklärt, was ich tun muss https://facebook.github.io/jest/docs/manual- mocks.html Ich glaube, ich habe die Verwendung des Mocks neben dem Ordner mqtt node_modules verpasst. – munkee

Antwort

1

Sie können es verspotten, ohne dispatcher aus dem ersten Modul zu entfernen, da dispatcher ein Export war.

in ./__mocks__/notifications.js

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

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

module.exports = notifications; 

dann in Ihrem Test, dann würden Sie jest.mock('path/to/notifications.js') nennen.

Ganz einfach, Sie sagen jest, dass jederzeit das Modul notifications erforderlich ist, erfordern die Mock, die tatsächlich das ursprüngliche Modul mit einer ersetzten Dispatcher-Funktion lädt und das durch.

Jetzt gibt es eine potenzielle Einschränkung ... dabei ändern Sie nur das Export-Objekt, so dass es nur funktioniert, wenn Ihr notifications Modul dispatcher über module.exports.dispatcher ruft.


wenn Sie stattdessen module.exports.dispatcher innerhalb der Quelldatei nicht nennen wollen, dann ja Sie dispatcher in seinem eigenen Modul herausziehen, aber es spöttisch ziemlich ähnlich aussehen sollte.

in ./__mocks__/dispatcher.js

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

und rufen jest.mock('path/to/dispatcher.js') in Ihrem Test.

+0

Danke dafür und zu Szenario 2.Wenn du sagst, zieh das in ein anderes Modul aus meinst du nur für den Mock oder meinst du es ist ein eigenes Modul insgesamt was natürlich dann viel einfacher ist zu verspotten als es ist – munkee

+0

Gefolgt Szenario 1 und nur über module.exports.dispatcher aufgerufen. Hervorragende Anleitung danke. – munkee

+0

für Szenario 2, genau das, was Sie beschrieben haben. es ist einfacher zu spotten, wenn es getrennt ist. –

Verwandte Themen