在编写QUnit测试时,我对'throws'的行为感到惊讶。 关于以下代码(http://jsfiddle.net/DuYAc/75/),有人可以回答我的问题:
function subfunc() {
throw "subfunc error";
}
function func() {
try {
subfunc();
} catch (e) {}
}
test("official cookbook example", function () {
throws(function () {
throw "error";
}, "Must throw error to pass.");
});
test("Would expect this to work", function () {
throws(subfunc(), "Must throw error to pass.");
});
test("Why do I need this encapsulation?", function () {
throws(function(){subfunc()}, "Must throw error to pass.");
});
test("Would expect this to fail, because func does not throw any exception.", function () {
throws(func(), "Must throw error to pass.");
});
只有第二次测试失败,尽管这是我自然选择编写此测试...
问题:
1)为什么我必须使用内联函数来包围我测试的函数?
2)为什么最后一次测试没有失败? 'func'不会抛出任何异常。
感谢阅读任何解释。
答案 0 :(得分:7)
1)为什么我必须使用内联函数来包围我测试的函数?
你没有。当您编写throws(subfunc(), [...])
时,会先评估subfunc()
。当subfunc()
抛出throws
函数之外时,测试立即失败。为了解决这个问题,你必须通过throws
函数。 function(){subfunc()}
有效,但subfunc
也是如此:
test("This works", function () {
throws(subfunc, "Must throw error to pass.");
});
2)为什么最后一次测试没有失败? 'func'不会抛出任何异常。
出于同样的原因。首先评估func()
。由于没有明确的return
语句,因此返回undefined
。然后,throws
尝试拨打undefined
。由于undefined
不可调用,因此抛出异常并且测试通过。
test("This doesn't work", function () {
throws(func, "Must throw error to pass.");
});