2013-05-03 48 views
3

异步测试如何在Intern测试框架中工作?我试图让它们完全按照示例运行,但异步测试立即通过,而不等待回调被运行。异步测试如何在实习生中工作?

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

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

+0

也许测试通过,因为回调_is_被称为预期和您的回调内的断言恰好通过?我猜你已经证实回调没有被调用。只是一个想法。 – bitpshr 2013-05-03 00:55:46

+0

那么,'conn.connect'必须执行异步请求,但是在任何XMLHttpRequest发生之前触发回调。 – 2013-05-03 01:00:59

+0

那么,我已经想出了即使在连接建立之前触发回调。但是,'result'变量保存状态,我只有在状态等于某个值时才需要检查它。我可以说'这不是我的情况,当你打另一个结果时再次打电话'吗? – 2013-05-03 01:04:38

回答

5

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

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

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不能自动解决的承诺;最后你自己去做。

+0

感谢您的回答!看看我上面的评论 - 我在那里描述问题。 – 2013-05-03 01:16:40

1

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

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

相关问题