2015-01-25 1 views
1

Я использую QUnit для проверки функции, которая вызывает ошибку в случае недопустимых входов. I am способен проверить эту функцию, вставив ее в анонимную функцию, но не уверен, почему это необходимо. Если я не делаю этого, сообщает QUnit:QUnit завершается, когда функция с аргументами arg исключается, если она не обернута в функцию anon

Died on test #4  at http://localhost:8000/qunit/throwsTest.js:1:7: sometimesThrows 

Следует отметить, что это сообщение включает выброшенные ошибки.

Я также заметил, что могу выполнять функции, которые не требуют работы args, если я передаю функцию как аргумент, а не вызываю его.

Отъезд my fiddle для просмотра в прямом эфире.

QUnit.test("throws test", function(assert) { 
    function alwaysThrows() { throw "alwaysThrows"; } 

    function sometimesThrows(foo) { 
    if (foo) { 
     return true; 
    } 
    else { 
     throw "sometimesThrows"; 
    } 
    } 

    assert.throws(alwaysThrows, "alwaysThrows throws (works)") 

    assert.ok(sometimesThrows(true), "sometimesThows doesn't throw (works)"); 
    assert.throws(function() { 
    sometimesThrows(false); 
    }, "sometimesThrows throws inside anonymous function (works)"); 

    // Where the unexpected behavior occurs. 
    // The error _is_ being thrown being thrown. 
    assert.throws(sometimesThrows(false), "sometimesThrows throws (terminates)"); 

}); 

Если упаковка функции, которая будет испытаны в анонимной функции является предполагаемым способом для получения этой работы, если кто-то может объяснить, почему , я обнаружил бы, что освещая в развитии своей интуиции.

ответ

4

TL; DR: Это точно так, как должно работать throws() assertion in QUnit, и как оно должно работать.

длинный, вытянутый ответ:

В вашем примере вы вызываете утверждение с результате вызова к sometimesThrows(false). То есть в вашем примере выше, когда вы вызываете метод QUnit assert (assert.throws()), вы передаете два значения: возвращаемое значение от sometimesThrows() и строковое сообщение.

Других слов, ваш пример:

assert.throws(sometimesThrows(false), "sometimesThrows throws (terminates)"); 

является первым первые вызова sometimesThrows() метода с false аргументом, который исполняет этот метод сразу же, таким образом, метания ошибки. Но где эта ошибка? Дело в том, что из вашего метода выбрана ошибка (sometimesThrows()) непосредственно вtest(), которую вы написали, обходя полностью звонок assert.throws(). Другими словами, вызов функции assert.throws() никогда не произойдет, поскольку ошибка была выбрана до того, как она будет вызвана в потоке выполнения.

Вместо этого мы должны передать функции assert.throws() еще одну функцию, которая может затем завернуть в try...catch блоке обнаружить, была ли брошена ошибка. Мы могли бы отделить это и фактически передать именованную функцию, если вы предпочитаете (по сравнению с анонимной встроенной функцией), но это ничего не изменит:

QUnit.test ("throws test", function (assert) { // ..

function sometimesWrapper() { 
    sometimesThrows(false); 
} 

assert.throws(sometimesWrapper, "sometimesThrows throws (terminates)"); 

});

Обратите внимание, что мы не делаем вызоваsometimesWrapper(), мы передаем его в качестве аргумента метода throws() утверждения. Внутри, QUnit затем обертывает фактически , вызывающий из sometimesWrapper() в блок try...catch, чтобы он мог определить, прошло или нет утверждение. Вы можете увидеть это в source code on Github, если хотите.

+0

Это имеет смысл. Большое спасибо за разъяснение поведения! –

 Смежные вопросы

  • Нет связанных вопросов^_^