2017-09-13 76 views
1

首先,我试图第二次测试被调用的函数返回正确的值。更具体地说,我试图第二次测试socket.on()返回正确的值。如何测试使用sinon.spy调用socket.io事件

我知道Sinon.spy()可以检测一个函数是否被调用。但它似乎不适用于socket.io事件。

我想试验中,例如

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

如果 'eventName的' 之称。我试过

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回调函数,看看它是否以及如何运行。

var callbackSpy = sinon.spy(cb); 

然后,传递间谍为回调:

socketio.on(eventName, callbackSpy); 

和测试,如果回调是有史以来与所需的参数值运行:

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

非常感谢!这清除了我对sinon.spy的困惑。但是,我应该如何测试回调被调用两次并在第二次被调用时接收到正确的数据? – Keming

+0

@Keming参见http://sinonjs.org/releases/v2.0.0/spies/你可以通过'callbackSpy.getCall(1).args [0] === something'来测试第二个参数(索引'1')呼叫 – apsillers