了解QUnit异常测试

5

在编写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'没有抛出任何异常。

很感谢能阅读到任何解释。

1个回答

7

1) 为什么我需要使用内联函数来包围我的被测试函数?

其实不需要。当你写throws(subfunc(), [...])时,subfunc()首先被计算。由于subfunc()throws函数外抛出异常,测试会立即失败。为了解决这个问题,你需要传递一个函数给throwsfunction(){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.");
});

很好的解释。不要调用函数,而是将其传递给throws!非常感谢。我今天学习了一些JS。 ;) - user3190756

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接