2016-06-13 18 views
7

In uno dei test, è necessario affermare che uno dei 3 elementi è presente. Attualmente stiamo facendo utilizzando il protractor.promise.all() e Array.reduce():Asserire che un array si riduce a true

var title = element(by.id("title")), 
    summary = element(by.id("summary")), 
    description = element(by.id("description")); 

protractor.promise.all([ 
    title.isPresent(), 
    summary.isPresent(), 
    description.isPresent() 
]).then(function (arrExists) { 
    expect(arrExists.reduce(function(a,b) { return a || b; })).toBe(true); 
}); 

c'è un modo migliore per risolvere con Jasmine senza risolvere le promesse in modo esplicito? Avremmo bisogno di un matcher personalizzato o è possibile risolvere con i matchers integrati?

+1

Nota che invece di 'reduce' puoi usare' arrExists.some (function (a) {return a;}) '. Con Jasmine dovresti usare l'argomento ['done' nel callback' it'] (http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support) e chiamarlo quando hai terminato il test . Non penso che ci sia un modo migliore. Hai comunque bisogno di aspettare che le promesse si risolvano. – trincot

+0

@trincot ringrazia per il punto. Probabilmente avrei già detto che ['expect()' è "rattoppato" in Protractor per risolvere implicitamente le promesse] (http://www.protractortest.org/#/control-flow#protractor-adaptations) .. ma da I devono combinare i risultati di più promesse tra loro, potrebbe non essere d'aiuto in questo caso. – alecxe

+1

Si dovrebbe fornire 'false' come valore iniziale in modo che funzioni anche su array vuoti. Oppure usa invece '.some (Boolean)'. – Bergi

risposta

2

Controllare questo:

let EC = protractor.ExpectedConditions; 

let title = EC.visibilityOf($("#title")), 
    summary = EC.visibilityOf($("#summary")), 
    description = EC.visibilityOf($("#description")); 

expect(EC.or(title, summary, description)()).toBeTruthy('Title or summary or description should be visible on the page') 

Si noti che sto funzione che restituisce ExpectedCondition esecutivo - in modo da sto risultato di quella funzione (promessa che verrà risolto a booleano) ottenendo invece della funzione.

È possibile utilizzare .presenceOf() se ne avete bisogno, invece .visibilityOf()

http://www.protractortest.org/#/api?view=ExpectedConditions.prototype.or

+0

Fantastica idea di utilizzare le condizioni previste, mai pensato a quello. Grazie. – alecxe

3

Si potrebbe semplicemente ottenere tutti gli elementi con un unico selettore e affermare che il conteggio è superiore a zero:

var title_summary_description = element.all(by.css("#title, #summary, #description")); 
expect(title_summary_description.count()).toBeGreaterThan(0); 
+0

Interessante pensare fuori dagli schemi, grazie! – alecxe

Problemi correlati