2017-09-13 10 views
1

まず、呼び出されている関数が正しい値を返す2回目のテストを試みています。具体的には、socket.on()がイベントを受け取った2回目のテストを試行していますが、正しい値が返されます。sinon.spyで呼び出されているsocket.ioイベントをテストするには

Sinon.spy()は、関数が呼び出されているかどうかを検出できます。しかし、socket.ioイベントではうまくいかないようです。

'eventNameのが' と呼ばれている場合、私は

var socketio = io.connect(someUrl); 
socketio.on(eventName, cb); 

、例えばテストしようとしています。試しました

var spy = sinon.spy(socketio, 'on'); 
assert(spy.withArgs(eventName).called); 

しかし、それは決して呼ばれていないと言います。

はさらに、私は、コールバック関数内のデータをテストしたい場合は、例えば

var socketio = io.connect(someUrl); 
socketio.on(eventName, function(data) { 
    data.should.equal(something); 
}); 

がそれをテストすることが可能です、右かないですか?

アップデート:私は、しかし、私は、これはハック方法だと思いコールバック

var count = 0; 
socketio.on(eventName, function(data) { 
    count++; 
    if(count === 2) { 
     data.should.equal(something) 
    } 
} 

に数を追加することで問題を解決し

、それを行うための任意の標準/スマートな方法があります(もし可能ならsinonを使って)?

+0

はにタイプミスがあり、あなたの接続の例?スパイのメソッドを持っていない 'withArg' - ' withArgs'である必要があります –

+0

@TristanHessellごめん、それはタイプミスです – Keming

答えて

1

onにスパイしたくない - それは、リスナーをセットアップしたときに一度だけ呼び出されます。実際に使用されているかどうかは気にしないでください。

代わりに、リスナーが実際に使用されているかどうかを確認するためにスパイしたい場合を除き、 cbコールバック関数を監視して、それが実行されているかどうか、どのように実行されているかを確認する必要があります。今までに必要な引数の値で実行されたコールバック場合

socketio.on(eventName, callbackSpy); 

とテスト:

var callbackSpy = sinon.spy(cb); 

その後、コールバックとしてではそのスパイを渡す

assert(callbackSpy.calledWith(something)); 
+0

ありがとう!それは私のsinon.spyについての混乱を解消します。しかし、コールバックが2回呼び出されたかどうかをテストし、2回目にコールされたときに正しいデータを受け取るにはどうすればよいですか? – Keming

+0

@Keming http://sinonjs.org/releases/v2.0.0/spies/を参照してください。 'callbackSpy.getCall(1).args [0] === something'は第2引数の第1引数をテストします'1')呼び出し – apsillers

関連する問題