Próbuję napisać test dla Jasmine Test Framework, który oczekuje błędu. W tej chwili używam integracji Jasmine Node.js z GitHub .
W moim module Node mam następujący kod:
throw new Error("Parsing is not possible");
Teraz próbuję napisać test, który oczekuje tego błędu:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
Próbowałem również Error()
i kilka innych wariantów i po prostu nie mogę dowiedzieć się, jak to zrobić.
javascript
testing
node.js
jasmine
echox
źródło
źródło
Function.bind
: stackoverflow.com/a/13233194/294855Odpowiedzi:
powinieneś przekazać funkcję do
expect(...)
wywołania. Kod, który masz tutaj:próbuje zadzwonić
parser.parse(raw)
w celu przekazania wyniku doexpect(...)
,Zamiast tego spróbuj użyć anonimowej funkcji:
źródło
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Brak argumentów oznacza sprawdzenie, czy w ogóle rzuca. Nie wymaga dopasowania ciągów. Zobacz także: stackoverflow.com/a/9525172/1804678parser.parse
użytythis
, przekazanie go bez kontekstu przyniesie nieoczekiwane rezultaty. Możesz przejśćparser.parse.bind(parser)
, ale szczerze mówiąc ... anonimowa funkcja byłaby bardziej elegancka.Ty używasz:
Ale jeśli spojrzysz na komentarz funkcji (oczekiwany jest ciąg znaków):
Przypuszczam, że powinieneś napisać to w ten sposób (używając lambda - anonimowej funkcji):
Potwierdza to poniższy przykład:
Douglas Crockford zdecydowanie zaleca takie podejście, zamiast używać „throw new Error ()” (sposób prototypowania):
źródło
Error
( jsfiddle.net/k1mxey8j ). Twój rzucony obiekt oczywiście nie będzie miał.stack
właściwości, co może być ważne, jeśli chcesz skonfigurować automatyczne raportowanie błędów.Bardziej eleganckim rozwiązaniem niż tworzenie anonimowej funkcji, której jedynym celem jest owijanie innej, jest użycie
bind
funkcji es5 . Funkcja wiązania tworzy nową funkcję, która po wywołaniu ma swojąthis
ustawione słowo kluczowe na podaną wartość, z podaną sekwencją argumentów poprzedzającą podaną podczas wywołania nowej funkcji.Zamiast:
expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");
Rozważać:
expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");
Składnia powiązania umożliwia testowanie funkcji o różnych
this
wartościach i, moim zdaniem, sprawia, że test jest bardziej czytelny. Zobacz także: https://stackoverflow.com/a/13233194/1248889źródło
Zastępuję dopasowywanie Jasmine toThrow następującym, co pozwala dopasować właściwość name wyjątku lub właściwość message. Dla mnie sprawia to, że testy są łatwiejsze do pisania i mniej kruche, ponieważ mogę wykonać następujące czynności:
a następnie przetestuj za pomocą:
To pozwala mi później ulepszyć komunikat o wyjątku bez przerywania testów, gdy ważne jest, że wygenerował oczekiwany typ wyjątku.
Jest to zamiennik programu toThrow, który pozwala na:
źródło
expect(blah).toThrow()
. Brak argumentów oznacza sprawdzenie, czy w ogóle rzuca. Nie wymaga dopasowania ciągów. Zobacz także: stackoverflow.com/a/9525172/1804678Jak wspomniano wcześniej, należy przekazać
toThrow
funkcję, ponieważ jest to funkcja opisywana w teście: „Spodziewam się, że ta funkcja wyrzuci x”Jeśli używasz Jasmine-Matchers , możesz również użyć jednego z poniższych, jeśli odpowiadają sytuacji;
lub
źródło
expect(foo).toThrowError(TypeError);
w Jasmine 2.5: jasmine.github.io/2.5/introductionWiem, że to więcej kodu, ale możesz także:
źródło
Dla miłośników kawy
źródło
Dla każdego, kto nadal może napotykać ten problem, dla mnie opublikowane rozwiązanie nie działało i nadal zgłaszało ten błąd:
Error: Expected function to throw an exception.
później zdałem sobie sprawę, że funkcja, którą spodziewałem się zgłosić, była funkcją asynchroniczną i spodziewała się obiecać zostać odrzuconym, a następnie rzucić błąd, i to właśnie robiłem w moim kodzie:i to właśnie zrobiłem w teście i zadziałało:
źródło
expectAsync
Rozwiązałem