2017-04-08 9 views
0

Jest Mockingは本当に今私を混乱させる。Jest Mocking - シンプルモック

私は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から呼び出されます。私のテストファイルでは、単にNotificationProcessorに電子メールを送ります。この電子メールは解析され、ディスパッチャに発行されます。

この単純な関数の実装を嘲笑する方法を教えてください。

+0

が回答を投稿しましたが、おそらくmqttclientに通知を発行させたくないため、これを実行したいと考えています。その場合は、代わりにmqttclient.publishをモックしないのはなぜですか? –

+0

正確にイェップしてください。私は.publishを模倣しようとしましたが、それは今私の知識を少し超えていました。私はバニラフォーマットのnpm mqttを使用しています。私は接続を偽ることができますが、これはmqttclientに割り当てられ、プロトタイプの.publishを持つMqttClient関数を返します – 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モジュールが必要なときはいつもjestに伝えています。実際に元のモジュールに置き換えられたディスパッチャ関数を実際にロードするモックが必要です。

ここで潜在的な警告があります。これを実行すると、エクスポートオブジェクトのみが変更されるため、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

続いて、module.exports.dispatcher経由で呼び出されます。優れた指導はありがとうございます。シナリオ2の場合は – munkee

+0

です。それが分離しているときは嘲笑する方が簡単です。 –