2014-04-23 13 views
30

C'è un modo per stampare un messaggio di errore personalizzato quando un Jasmine expect() fallisce?Stampa messaggio su expect() asser failure

Ad esempio, per il test end-to-end ho una serie di pagine Web e utilizzo un test per accedere a ciascun URL e affermare che esiste un elemento in ogni pagina. So che posso mettere ogni expect() in un test separato, ma preferisco scorrere l'array e registrare l'URL della pagina in caso di errore.

risposta

27

ho cercato proprio per questo oggi, e mettere un commento qui: https://github.com/adobe/brackets/issues/2752

La sintassi che è stato discusso è un'estensione di Jasmine per consentire una causa da aggiungere - così si sarebbe in grado a scrivere:

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

che è ancora in fase di discussione, dopo alcuni anni, e non può giungere a buon fine. Un altro modo che ho trovato per farlo è quello di creare un matcher personalizzato. In generale, penso che scoraggerei un matcher personalizzato senza essere sicuro di coprire tutte le basi con esso, ma in questo caso stiamo davvero controllando un valore vero/falso, quindi il matcher non è troppo spaventoso.

Possiamo creare il matcher personalizzato con un 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); 
}); 

Possiamo quindi utilizzare questo matcher per mettere un messaggio con i nostri fallimenti in quanto tale:

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

che darà un'uscita di fallimento incluso il nome del campo come tale:

Expected 'false' to equal 'true' because account_name 

NOTA: Vedo che le persone lo trovano ancora. informazioni in seguito dal team Jasmine è che v'è una funzionalità non documentata sul aspettarsi - è possibile includere un messaggio di errore personalizzato e funziona solo:

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

Il che è esattamente quello che è stato originariamente cercando.

+0

trovare fantastico! aspettarsi (qualcosa) .toBeFalsy ('should not ...'); funziona anche – ajd

+0

non funziona –

+0

Ciao! Sicuramente dovresti mettere la tua ultima scoperta sopra la tua risposta, quindi è direttamente accessibile (lascia il resto come log storici sotto). Grazie. – Bob

1

Avevo l'obbligo di registrare i messaggi personalizzati per Jasmine e ho usato il seguente metodo.

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

Si prega di notare che quello che ho menzionato sopra è in formato jasmine 1. Ci sarà un leggero cambiamento se stai usando jasmine 2. Spero che questo sia utile per te

21

Sì, possiamo stampare un messaggio di errore personalizzato quando un expect() non è riuscito in 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

Sebbene questa sintassi funzioni attualmente, non è documentata e dovrebbe essere utilizzata con attenzione. – midemarc

+1

Bello. Lo stesso trucco non sembra funzionare per 'toEqual'. Qualche soluzione? – bluenote10

+1

@ bluenote10, funzionerà –

2

Le altre risposte spiegano come hack 'aspettarsi', ma c'è un altro approccio che può risolvere il problema, anche se richiede di capovolgere il vostro pensiero in giro un po '. Invece di pensare all '"aspettativa" come al tuo comportamento sotto esame, pensa a tutte le aspettative sotto un singolo "it" come tuo comportamento sotto esame.

Il caso in cui mi sono imbattuto in questo problema di più è quando ho una funzione che sta facendo una specie di analisi intensiva e voglio scrivere 20, quasi identici, test.

Disporre gli ingressi e le uscite in questo modo:

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

Ora iterare l'elenco dei vostri dati di test, e lo chiamano 'it' dal all'interno il ciclo in questo modo:

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

Puoi ridurre la quantità di codice estraneo che vola attorno ai tuoi test e puoi formattare un messaggio per ogni aspettativa o gruppo di aspettative.