2012-04-17 11 views
9

Jestem nowy w Qunit i testowaniu jednostkowym.Potwierdzanie, że funkcja zgłasza wyjątki z Qunitem

Próbuję dowiedzieć się, co i jak przetestować następującą funkcję. To nie robi wiele w tej chwili, ale chciałem aby twierdzić, że gdybym go przekazywać nieprawidłowe wartości, że błędy są wyrzucane:

function attrToggle (panel, attr) { 
    'use strict'; 

    if (!panel) { throw new Error('Panel is not defined'); } 
    if (!attr) { throw new Error('Attr is not defined'); } 
    if (typeof panel !== 'string') { throw new Error('Panel is not a string'); } 
    if (typeof attr !== 'string') { throw new Error('Attr is not a string'); } 
    if (arguments.length !== 2) { throw new Error('There should be only two arguments passed to this function')} 

}; 

Jak mogę iść o twierdząc, że błąd zostanie wyrzucony jeśli którykolwiek z tych warunków nie są spełnione?

Próbowałem spojrzeć na stwierdzenie Qunit o "podwyżkach", ale uważam, że to nieporozumienie. Moja interpretacja będzie taka, że ​​test przejdzie, jeśli zostanie zgłoszony błąd.

Więc jeśli ja testowałem coś takiego:

test("a test", function() { 
    raises(function() { 
     throw attrToggle([], []); 
    }, attrToggle, "must throw error to pass"); 
}); 

Test powinien przekazać ponieważ błędy są wyrzucane.

Odpowiedz

15

Kilka rzeczy złych, przykładem jest praca w http://jsfiddle.net/Z8QxA/1/

Głównym problemem jest to, że są przechodzącą źle jako drugi argument do raises(). Numer second argument jest używany do sprawdzenia, czy został wygenerowany prawidłowy błąd, więc oczekuje się wyrażeń regularnych, konstruktora typu błędu lub wywołania zwrotnego, które umożliwiają wykonanie własnej weryfikacji.

W twoim przykładzie przekazałeś attrToggle jako typ błędu, który zostałby zgłoszony. Twój kod faktycznie rzuca typem Error, więc czek faktycznie nie powiódł się. Przechodząc Error jako drugi argument działa jak chcesz:

test("a test", function() { 
    raises(function() { 
     attrToggle([], []); 
    }, Error, "Must throw error to pass."); 
}); 

Po drugie, nie trzeba słowa kluczowego throw Dzwoniąc attrToggle() wewnątrz raises().

1

tak, prawie wszystko w porządku. raises() spodziewa się wygenerowanego błędu podczas testowania kodu.

Zazwyczaj używam funkcji try-catch do przechwytywania nieprawidłowych typów argumentów. Używam raises() do testowania throw. Jeśli wstawiłem niepoprawną wartość jako argument, a test nie był zgodny z raises(), to coś nie zostało przechwycone.

Powiązane problemy