3

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

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

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

4

2 回答 2

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它不会自动解决承诺一样工作;最后你自己做。

于 2013-05-03T01:11:26.033 回答
1

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

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

于 2013-05-03T00:38:53.203 回答