2014-04-23 12 views
30

Czy istnieje sposób wydrukowania niestandardowego komunikatu o błędzie w przypadku niepowodzenia Jasmine expect()?Wydrukuj wiadomość po wystąpieniu błędu oczekiwanego()

Jako przykład do testów końcowych mam szereg stron internetowych i używam jednego testu, aby przejść do każdego adresu URL i potwierdzić, że element istnieje na każdej stronie. Wiem, że mogę umieścić każdy expect() w osobnym teście, ale wolałbym iterować przez tablicę i rejestrować adres URL strony po niepowodzeniu.

Odpowiedz

27

Szukałem dokładnie to dzisiaj, i umieścić komentarz tutaj: https://github.com/adobe/brackets/issues/2752

składni, który został omówiony jest rozszerzeniem Jasmine aby umożliwić ponieważ należy dodać - tak byłbyś w stanie napisać:

expect(fields[i].element.exists()).toEqual(true).because(field[i].name + 'is expected to exist'); 

Jest to nadal przedmiotem dyskusji po kilku latach i może nie dojść do skutku. Innym sposobem, w jaki to zrobiłem, jest utworzenie niestandardowego mechanizmu dopasowującego. Generalnie myślę, że zniechęciłbym niestandardowego matchera bez pewności, że obejmuje on wszystkie bazy, ale w tym przypadku naprawdę sprawdzamy wartość prawdziwą/fałszywą, więc matcher nie jest zbyt przerażający.

Możemy utworzyć niestandardowe matcher z beforeEach:

beforeEach(function() { 
    var matchers = { 
    toEqualBecause: function(value, message) { 
     this.message = function() { 
     return "Expected '" + this.actual + "' to equal '" + value + "' because " + message; 
     }; 

     return this.actual == value; 
    } 
}; 

    this.addMatchers(matchers); 
}); 

Możemy wtedy użyć tego matcher umieścić wiadomość z naszych niepowodzeń jako takie:

expect(field[i].element.exists()).toEqualBecause(true, field[i].name); 

co da wyjście awarii w tym nazwę pola jako taką:

Expected 'false' to equal 'true' because account_name 

UWAGA: Widzę, że ludzie wciąż to znajdują. Później informacja od zespołu Jasmine jest to, że nie jest nieudokumentowana funkcja na oczekiwać - można to niestandardowy komunikat o awarii i po prostu działa:

expect(fields[i].element.exists()).toEqual(true, field[i].name + ' is expected to exist'); 

który jest dokładnie to, co było pierwotnie szukasz.

+0

Niesamowite znalezisko! oczekuj (coś) .toBeFalsy ("should not ..."); działa też – ajd

+0

nie działa –

+0

Cześć! Na pewno powinieneś umieścić swoje ostatnie odkrycie na swojej odpowiedzi, więc jest to bezpośrednio dostępne (resztę zostaw jako historyczne logi poniżej). Dzięki. – Bob

1

Miałem wymóg rejestrowania niestandardowych wiadomości dla Jasmine i użyłem następującej metody.

beforeEach(function(){ 
    this.addMatchers({ 
     customError: function(mesg){ 
         this.message= function() { 
              return mesg; 
             }; 
         return this.actual == true; 
         } 
        }); 
     }); 
if(<fail condidtion>){ 
    expect(false).customError(<Fail message>) 
} 

Proszę zauważyć, to, o czym wspomniałem powyżej, to format jaśminu 1. Jeśli użyjesz jaśminu, nastąpi niewielka zmiana. Mam nadzieję, że jest to dla ciebie przydatne

21

Tak, możemy wydrukować niestandardowy komunikat o błędzie, gdy oczekiwano() w Jasmine.

Code Snippet: 

    it('print a custom error message when an expect failed', function() { 

    var elemenToBeDisplayed=element(by.css("userName")); 

    /*custom error message will be displayed if expected condition 
    failed*/ 

    expect(elemenToBeDisplayed.isPresent).toBe(true,'Write your custom  
     error message here'); 
    }); 
+2

Ta składnia działa, ale nie jest dokumentowana i powinna być używana z ostrożnością. – midemarc

+1

Nice. Ta sama sztuczka nie działa dla 'toEqual'. Czy jest tam jakieś obejście? – bluenote10

+1

@ bluenote10, zadziała –

2

innych odpowiedzi wyjaśnić, jak się włamać „oczekiwać”, ale nie ma innego podejścia, które może rozwiązać problem, ale to wymaga, aby odwrócić swoje myślenie wokół trochę. Zamiast myśleć o "oczekiwaniu" jako o swoim zachowaniu w teście, zastanów się nad wszystkimi oczekiwaniami pod jednym "wezwaniem", jako zachowaniem poddanym próbie.

Przypadku, w którym najbardziej natknąłem się na ten problem, jest, gdy mam funkcję, która wykonuje intensywną parsowanie i chcę napisać 20, prawie identyczne, testy.

Rozmieszczanie wejść i wyjść tak:

var testDatas = [ 
    { 
    input: 'stringtoparse1', 
    output: 'String To Parse 1' 
    }, 
    { 
    input: 'stringtoparse2', 
    output: 'String To Parse 2' 
    }, 
    { 
    input: 'stringtoparse3', 
    output: 'String To Parse 3' 
    }, 
]; 

Teraz iteracyjne nad listą swoich danych testowych, a nazywają „go” z wewnątrz pętlę tak:

testDatas.forEach(function(test) { 
    it('should parse for input ' + test.input, function() { 
    expect(myParser(test.input).toEqual(test.output); 
    }); 
}); 

Możesz zredukować liczbę obcej metody, która lata wokół twoich testów, i sformatować wiadomość dla każdego oczekiwania lub grupy oczekiwań.

Powiązane problemy