异步测试如何在实习生中工作?

时间:2013-05-03 00:32:45

标签: javascript asynchronous promise intern

异步测试如何在实习测试框架中运行?我试图让它们像示例中那样运行,但异步测试立即通过而不等待回调运行。

it('should connect in 5 seconds', function () {
    var dfd = this.async(5000);
    conn.connect(credentials, dfd.callback(function(result) {
        expect(result).to.... something
    }));
}

测试立即通过。我做错了什么?

2 个答案:

答案 0 :(得分:5)

dfd.callback在执行之前不会执行任何操作。请记住,它是为promise回调(即传递给promise.then的函数)设计的,而不是Node.js样式的回调,其中参数可能是错误(即function (error, result) {})。它不会检查错误是否作为参数传递。

不知道conn是什么,但看到你如何将dfd.callback作为参数传递给非承诺的东西,我怀疑你是在尝试使用Node.js风格的回调并且呼叫立即出错。我们可能会在将来为这些类型的回调提供一个便利包装器,将它们转换为一个promise接口,但在那之前,你可能只需要这样做:

it('should connect in 5 seconds', function () {
    var dfd = this.async(5000);
    conn.connect(credentials, dfd.callback(function(error, result) {
        if (error) {
            throw error;
        }

        expect(result).to.... something
    }));
});

否则,在不知道conn是什么并看到你的实际断言是什么的情况下,很难说这里的问题是什么。只要回调中没有任何内容引发错误,测试就会被认为是成功的。

编辑:根据您上面的评论,听起来您的回调是多次使用不同信息调用的事件监听器。在这种情况下,你可以做的是这样的事情:

it('should connect in 5 seconds', function () {
    var dfd = this.async(5000);
    conn.connect(credentials, dfd.rejectOnError(function (result) {
        if (result !== 'what I want') {
            return;
        }

        expect(result).to.... something
        // all other tests…

        // nothing threw an error, so it is a successful test
        dfd.resolve();
    }));
});

dfd.rejectOnError的工作方式与dfd.callback类似,但它不会自动解决承诺;你最后自己这样做。

答案 1 :(得分:1)

你的结构没问题。 dfd为测试成功设置超时5秒,然后立即尝试conn.connect(),这不是实习生框架的一部分。如果您正在尝试简单的XHR请求,请尝试使用getUrlCallback函数。

他们在这个网址上有一个非常酷的测试列表:https://github.com/theintern/intern/wiki/Writing-Tests。查找两个异步示例。