2013-10-08 42 views
1

如何告诉QUnit在asyncTest期间将错误视为测试失败并继续进行下一个测试?QUYNit asyncTest在错误后不会继续

这里是QUnit停止一个ReferenceError后运行一个例子:jsfiddle

+0

我可以使用'testTimeouts',但它有风险,因为测试可能需要很多时间,并且如果您有一些错误测试,它将花费很多时间来运行所有测试! – Bakhshi

回答

1

错误异步测试中默默死去,如果出现而QUnit没有正式运行他们。

最简单的解决方案是将每个asyncTest内容封装在try/catch块中,该块在传播任何错误之后重新启动QUnit。实际上,我们实际上不得不污染具有一百万次尝试/捕获的代码 - 我们可以自动装饰您现有的方法。

例如:

// surrounds any function with a try/catch block to propagate errors to QUnit when 
// called during an asyncTest 
function asyncTrier(method) { 
    return function() { 
     try{ 
      // if the method runs normally, great! 
      method(); 
     } catch (e) { 
      // if not, restart QUnit and pass the error on 
      QUnit.start(); 
      throw new (e); 
     } 
    }; 
} 

QUnit.asyncTest("sample", 1, function() { 
     setTimeout(asyncTrier(function(){ 
      var foo = window.nonexistentobj.toString() + ""; // throws error 

      QUnit.ok("foo defined", !!foo) 
      QUnit.start(); 
     }), 1000); 
}); 

分叉的小提琴,与样品包装方法自动应用这样一个try/catch周围的每一个异步块:http://jsfiddle.net/bnMWd/4/

编辑:每评论更新。 )

+0

谢谢,但仍然有问题,'QUnit'会认为我的测试在调用'start'后已经完成。这会导致错误的输出,如果你运行一个自动化测试(例如业力),他们不会知道你还有测试运行,并且会在你最后一次“开始”之后结束你的测试会话。这里是你的代码的更新:http://jsfiddle.net/bakhshi/bnMWd/2/ – Bakhshi

+0

啊哈!新的解决方案 - 更详细一点(需要包装每个超时块),但传播错误,仍然可读。 – mjk