2015-02-26 17 views
11

Uno dei miei test si aspetta che il testo di un messaggio di errore sia uno di più valori. Dal getText() restituisce una promessa Non riesco a utilizzare il dosatore di gelsomino toContain(). Quanto segue non avrebbe funzionato in quanto protractor (jasminewd under-the-hood) non risolverebbe una promessa nella seconda parte del matcher, toContain() in questo caso:Expect item in array

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText()); 

Domanda: C'è un modo per controllare se un elemento è in una matrice con gelsomino + goniometro dove un elemento è una promessa?

In altre parole, sto cercando inversa di toContain() in modo che il expect() avrebbe implicitamente risolvere la promessa passata


Per aggirare il problema, posso risolvere esplicitamente la promessa con then():.

page.errorMessage.getText().then(function (text) { 
    expect(["Unknown Error", "Connection Error"]).toContain(text); 
}); 

Non sono sicuro che questa sia l'opzione migliore. Sarei anche a posto con una soluzione basata su terze parti come jasmine-matchers.


A titolo di esempio, questo tipo di affermazione esiste in Python:

self.assertIn(1, [1, 2, 3, 4]) 
+0

Utilizzare 'chai-promised' –

+0

@BenjaminGruenbaum se si potesse elaborare il suggerimento in una risposta con un esempio, sarebbe fantastico, poiché suona come una valida alternativa valida a un utente personalizzato. Grazie! – alecxe

+0

In generale, non mi piace offrire le librerie come risposta alle domande, dal momento che questo rende le domande-raccomandazioni per la libreria. Detto questo, penso che in questo caso sia probabilmente l'alternativa migliore. –

risposta

12

Sembra che avete bisogno di un matcher personalizzato. A seconda della versione di gelsomino che si sta utilizzando:

Con Il Gelsomino 1:

this.addMatchers({ 
    toBeIn: function(expected) { 
     var possibilities = Array.isArray(expected) ? expected : [expected]; 
     return possibilities.indexOf(this.actual) > -1; 
    } 
}); 


Con Il Gelsomino 2:

this.addMatchers({ 
    toBeIn: function(util, customEqualityTesters) { 
     return { 
      compare: function(actual, expected) { 
       var possibilities = Array.isArray(expected) ? expected : [expected]; 
       var passed = possibilities.indexOf(actual) > -1; 

       return { 
        pass: passed, 
        message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual 
       }; 
      } 
     }; 
    } 
}); 


Dovrete eseguire questo in la sezione beforeEach su ciascuno dei tuoi blocchi describe in cui verrà utilizzata.

tuo aspettano sarebbe simile:

expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]); 
5

La soluzione alternativa è quella di utilizzare .toMatch() matcher con Regular Expressions e nello specifico un carattere speciale | (chiamato "o"), che permette di abbinare una sola voce a successo:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/); 
3

Per me, la work-around che ho identificato s la migliore soluzione. Tuttavia, non dobbiamo dimenticare che si tratta di un'esecuzione asincrona e si potrebbe prendere in considerazione Jasmine's asynchronous support.

Poi, il test sarà simile alla seguente:

it('should check item is in array', function(done){ //Note the argument for callback 

    // do your stuff/prerequisites for the spec here 

    page.errorMessage.getText().then(function (text) { 
     expect(["Unknown Error", "Connection Error"]).toContain(text); 
     done(); // Spec is done! 
    }); 
}); 

Nota: Se non si passa questa tesi done al spec callback, sta andando a correre al completamento senza errori, ma nessuna affermazione verrà riportata nei risultati dell'esecuzione per quella specifica (in altre parole, quella specifica avrà le asserzioni 0) e potrebbe causare confusioni.