Matchers
Żaden test jednostkowy nie zda nam się na wiele bez możliwości określenia pewnych warunków, które dana funkcjonalność ma spełniać aby można ją było uznać za kompletną i poprawną. Wszystkie takie warunki kontruujemy za pomocą funkcji expect(), której argumentem będzie object under test natomiast warunek będzie określony za pomocą jednej z wybranej funkcji typu matcher
it('should return car engine name', function() {
var car = new Car('V8');
expect(car.engine).toBe('V8');
});
toBe
Jest to funkcja odpowiadające przypasowaniu ===
czyli sprawdzająca nie tylko równość wartości ale też typu dwóch obiektów.
expect(car.engine).toBe('V8');
toEqual
Funkcja weryfikująca równość wartości dwóch obiektów.
var foo = {
a: 12,
b: 34
};
var bar = {
a: 12,
b: 34
};
expect(foo).toEqual(bar);
toMatch
Służy do porównywania dwóch obiektów za pomocą wyrażenia regularnego.
var message = "foo bar baz";
expect(message).toMatch(/bar/);
expect(message).toMatch("bar");
toBeDefined / toBeUndefined
Matcher toBeDefined służy do określenia czy danych obiekt (zwyczajowo property innego obiektu) jest zdefiniowany czy nie, matcher toBeUndefined natomiast jest jego odwrotnością.
Warto tutaj zwrócić uwagę na property not, które zakłada, że dany matcher zwróci wartość negatywną.
var car = new Car('V8');
expect(car.engine).toBeDefined();
expect(car.engine).not.toBeUndefined();
car = new Car();
expect(car.engine).not.toBeDefined();
expect(car.engine).toBeUndefined();
toBeTruthy / toBeFalsy
Matchery toBeTruthy oraz toBeFalsy służą do weryfikacji, czy dana wartość po zrzutowaniu na boolean da wartość true/false.
TIP: Wykorzystywanie tych dwóch matcherów może powodować generowanie falszywie-pozytywnych wyników naszych testów jako że w ramach sprawdzania nie jest brana pod uwagę ani dokładna wartość ani jej typ!
var car = new Car('V8');
expect(car.driver).toBeFalsy();
expect(car.engine).toBeTruthy();
Weryfikacja wyjątków
Aby zweryfikować czy dana funkcja rzuciła wyjątek w trakcie swojego działania przydatny jest matcher toThrow.
expect(Car).toThrow('Engine type argument is required');
Jeżeli chcemy zweryfikować czy został rzucony wyjątek danego typu użyjemy metody toThrowError.
expect(car.drive).toThrowError(RangeError, 'Invalid driving speed');
A co jeśli potrzebujemy przekazać argument do metody, od której oczekujemy, że rzuci wyjątek? W tym przypadku z pomocą przychodzą nam funkcje anonimowe.
expect(function () { car.drive(-1); }).toThrowError(RangeError, 'Invalid driving speed');
TIP: Aby uniknąć zbyt rozwlekłych funkcji anonimowych można w tym miejscu wykorzystać funkcję bind().
Partial matching
Jeżeli porównując dwa obiekty interesuje nas wyłącznie część kluczy i ich wartości do porównywania możemy wykorzystać jasmine.objectContaining.
foo = {
a: 1,
b: 2,
bar: "baz"
};
expect(foo).toEqual(jasmine.objectContaining({
b: 2
}));