如何测试使用sinon.spy调用的socket.io事件

时间:2017-09-13 18:46:31

标签: node.js socket.io mocha sinon

首先,我试图第二次测试被调用的函数返回正确的值。更具体地说,我正在尝试第二次测试socket.on()收到一个事件时返回正确的值。

我知道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)
    }
}

但我认为这是一种hacky方式,是否有任何标准/智能方法(如果可能使用sinon)?

1 个答案:

答案 0 :(得分:1)

你不想监视on - 在你设置监听器时只调用一次。 (除非你真的想窥探听众是否正在设置,并且不关心他们是否真的被使用过。这似乎不是你想要的。)

相反,您希望监视cb回调函数,以查看它是否以及如何运行。

var callbackSpy = sinon.spy(cb);

然后,将该间谍作为回调传递:

socketio.on(eventName, callbackSpy);

并测试回调是否使用所需的参数值运行:

assert(callbackSpy.calledWith(something));