不止一次调用实习生asyn回调

时间:2013-05-03 09:54:00

标签: javascript unit-testing asynchronous strophe intern

是否可以指定应在实习生中调用asyn回调的情况?假设我们有一个测试测试一个连续执行多个XHR请求的方法。具体来说,我正在尝试测试我为Strophe.connect提供的回调实现。它的工作方式是将多个XHR请求发送到服务器,该服务器处理初始XMPP(BOSH)握手。

是否有可能在5秒内测试回调被调用状态码为5(已连接)?问题是回调被多次触发,我需要等待正确的状态代码,扔掉其他代码。

var dfd = this.async(5000);

conn.connection.connect("jid", "pass", dfd.callback(function(status) {
    if(status === 5) {
        expect(status).to.have(something);
    } else {
        // here, I need to say intern to
        // do nothing, just let the callback 
        // to be triggered once more
    }
    return true;
}));

1 个答案:

答案 0 :(得分:1)

因为您的回调将被多次调用,我建议明确解决延迟而不是用dfd.callback包装回调。尝试这样的事情:

var dfd = this.async(5000);

conn.connection.connect('jid', 'pass', dfd.rejectOnError(function (status) {
    if (status !== 5) {
        return;
    }

    // do any assertions here

    // explicitly resolve the test since it was successful to this point
    dfd.resolve();
}));

首先,您会注意到我们用dfd.rejectOnError包装回调。如果在执行回调函数期间抛出任何错误,此便捷方法将拒绝延迟。接下来,我们摆脱了dfd.callback,因为如果包装的回调执行而没有抛出错误,这将尝试解决延迟。因为您的回调将被多次调用,所以这不起作用。通过仅在满足条件时显式解析延迟(status !== 5且任何断言通过),只要延迟在五秒内解析,您的回调就可以执行任意次数。