异步测试如何在实习测试框架中运行?我试图让它们像示例中那样运行,但异步测试立即通过而不等待回调运行。
it('should connect in 5 seconds', function () {
var dfd = this.async(5000);
conn.connect(credentials, dfd.callback(function(result) {
expect(result).to.... something
}));
}
测试立即通过。我做错了什么?
答案 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。查找两个异步示例。