Понимание тестирования исключений QUnit

При написании тестов QUnit я был удивлен поведением "бросков". Что касается следующего кода ( 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 ответ

Решение

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.");
});
Другие вопросы по тегам