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

Pav*_* S. 3 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
    }));
}
Run Code Online (Sandbox Code Playgroud)

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

C S*_*ver 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
    }));
});
Run Code Online (Sandbox Code Playgroud)

否则,在不知道什么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();
    }));
});
Run Code Online (Sandbox Code Playgroud)

dfd.rejectOnError工作就像dfd.callback它不会自动解决承诺; 你最后自己这样做.