2013-10-09 14 views
9

sockjsを使用して実装されたWebソケットをテストしたいと思います。テスト用のWebソケットをユニット化する方法 - JavaScript

var sock = new SockJS('http://mydomain.com/my_prefix'); 
    sock.onopen = function() { 
     console.log('open'); 
    }; 
    sock.onmessage = function(e) { 
     console.log('message', e.data); 
    }; 
    sock.onclose = function() { 
     console.log('close'); 
    }; 

私はゴーグルしてこれを見つけました。article。これは、実際の接続を偽造するのではなく、実際に接続しているため、十分ではありません。

私もそうしようとしましたが、回答のない質問hereしか見つかりませんでした。

誰かがsinonjsを提案しましたが、私はまともな例を見つけることができません。

誰かがこのトピックについて少し光を当てることができたら、私は感謝します。

答えて

3

WebSocketサーバーのように、外部リソースにアクセスする機能をユニットテストする場合は、通常、外部リソースを表すためにモックオブジェクトを使用します。モックオブジェクトは、外部リソースのように見え、動作するオブジェクトですが、実際にはアクセスしません。さらに、テストされたコードが期待どおりに動作するかどうかをテストコードに報告することを可能にするロギング機能を持つことができます。

あなたの場合、通常のSockJSオブジェクトのすべての関連プロパティとメソッドを持つ模擬SockJSオブジェクトを作成しますが、その実装は実際にサーバーに接続しません。メソッド呼び出しだけをログに記録し、既存のサーバーが送信する予定の応答を返します。

次に、テストするコードをリファクタリングしてソケット自体を作成せず、代わりに外部から割り当てられたソケットオブジェクトを取得します(これは "dependency injection"と呼ばれ、unit-テスト可能なコード)。

実際のコードでは、実際のSockJSオブジェクトを割り当てます。しかし、単体テストでは、モックオブジェクトを割り当てます。テストメソッドを呼び出した後、ユニットが期待されるデータをサーバーに送信したかどうかを調べるために模擬オブジェクトを調べることができます。

+2

フィードバックのおかげで、それは多くの仕事のように見えます。私は準備が整ったものを探しています。たとえば、ジャスミンには、偽のAJAX呼び出しを作成するためのすべてのツールがあります。 Webソケットはますます普及しています。私にこれらのモックオブジェクトを箱から出してくれるライブラリはありますか? –

+2

@ user2855314 Jasminは実際のオブジェクトの周りのデコレータとしてモックオブジェクトを実装しています。その用語は「スパイ」です。 'SpyOn'メソッドは' andCallFake(function) 'を呼び出すことで連鎖させることができます。これはメソッド呼出しを独自の実装に委譲します。これにより、オブジェクトが実際にサーバーに接続しようとするのを防ぎ、代わりに実装が返すものを返します。 – Philipp

+1

@Philipp、これに例を挙げてください。 –