2016-05-16 25 views
11

In uno dei nostri test, abbiamo la seguente serie di aspettative:Semplificare più controlli booleani in una sola

expect(headerPage.dashboard.isDisplayed()).toBe(true); 
expect(headerPage.queue.isDisplayed()).toBe(true); 
expect(headerPage.claimSearch.isDisplayed()).toBe(true); 
expect(headerPage.claim.isDisplayed()).toBe(true); 
expect(headerPage.case.isDisplayed()).toBe(true); 
expect(headerPage.calendar.isDisplayed()).toBe(true); 

Da un lato, avere più aspettative semplici forniscono un feedback più preciso e comprensibile, ma, su un altro, sembra che sia viola il principio DRY e lo "one expectation per test" linee guida comunemente accettabili.

C'è un modo per convertirlo/semplificarlo in una singola attesa?


headerPage è una pagina Oggetto, dashboard e di altri settori oggetto pagina sono link di navigazione.

risposta

15

Credo che tu abbia frainteso lo scopo della linea guida "un'aspettativa per test". Il punto non è quello di combinare un gruppo di aspettative in una singola aspettativa, ma di dividere le vostre aspettative in test separati.

seguire lo spirito di quella linea guida, si può scrivere i test in questo modo:

describe("The header page", function() { 
    var headerPage; 
    beforeEach(function() { 
     //Common logic here 
    }); 

    it("displays the dashboard", function() { 
     expect(headerPage.dashboard.isDisplayed()).toBe(true); 
    }); 

    it("displays the queue", function() { 
     expect(headerPage.queue.isDisplayed()).toBe(true); 
    }); 

    it("displays the claimSearch", function() { 
     expect(headerPage.claimSearch.isDisplayed()).toBe(true); 
    }); 

    //etc. 
}); 

Questo è un bel po 'più dettagliato di quello che hai; ma questo è il motivo per cui queste sono linee guida non regole. È un compromesso tra quanto verboso si fanno i test, rispetto a quanto è facile eseguire il debug in un secondo momento. ("La pagina di intestazione visualizza il dashboard: FAILED") è un messaggio di errore di test molto chiaro e specifico, rispetto a ottenere lo stesso messaggio di errore indipendentemente da quale aspettativa sia effettivamente fallita.

Io sicuramente non proverei a combinare tutte queste linee in un'unica riga. Se non vuoi dividerlo in una serie di diversi casi di test, lascerei semplicemente com'è.

+0

Questo ha perfettamente senso. Penso anche ad affrontarlo in modo diverso - ad avere un metodo di oggetto di pagina che restituisca i collegamenti di navigazione visibili correnti e lo asserisca invece. Pubblicherà anche qui quando è pronto. Grazie mille! – alecxe

+0

FYI, pubblicato quello che ho finito con. – alecxe

-1

cosa sull'utilizzo di una funzione di supporto che restituisce i risultati di tutti i test, qualcosa di simile a

expect(headerDisplayTests()).toBe(true); 

function headerDisplayTests() { 
    return headerPage.dashboard.isDisplayed() && 
      headerPage.queue.isDisplayed() && 
      headerPage.claimSearch.isDisplayed() && 
      headerPage.claim.isDisplayed() && 
      headerPage.case.isDisplayed() && 
      headerPage.calendar.isDisplayed(); 
} 
+1

Grazie , Ho pensato al trucco "Estrai il metodo", ma questo non avrebbe funzionato visto che 'isDisplayed()' restituisce una promessa..'protracto r.promise.all() 'sarebbe necessario qui. Si prega di vedere se è possibile regolare la risposta per tenerne conto. – alecxe

+0

se isDisplay() restituisce una promessa, quindi come sarebbe il tuo esempio di aspettativa (headerPage.dashboard.isDisplayed()). ToBe (true); mai lavorare? – nuway

+0

Sì, perché il goniometro si aspetta che la patch risolva implicitamente le promesse .. – alecxe

1

Approccio alternativo. Quello che ho finito con era quello di aggiungere un metodo oggetto pagina che restituisce i etichette della navigazione attualmente visibile collega:

this.getVisibleLinks = function() { 
    return $$(".ap-header-nav-tabs li a").filter(function (link) { 
     return link.isDisplayed(); 
    }).getText(); 
}; 

Poi, la prova di cui sopra sarebbe trasformato in un conciso e leggibile:

expect(headerPage.getVisibleLinks()).toEqual(["Dashboard", "Queue", "Claim Search", ...]); 
1

Se questa è la logica che si sta utilizzando su più specifiche, è possibile esaminare il gelsomino custom matchers per incapsulare la logica.

Sarebbe essere scritto un po 'come questo:

var customMatchers = { 
    toDisplayWidgets: function(util, customEqualityTests) { 
     return { 
      compare: function(actual, expected) { 
        function isDisplayingWidgets(page) { 
         return page.dashboard.isDisplayed() && 
          page.queue.isDisplayed() && 
          page.claimSearch.isDisplayed() && 
          page.claim.isDisplayed() && 
          page.case.isDisplayed() && 
          page.calendar.isDisplayed(); 
        } 

        var result = {}; 
        result.pass = isDisplayingWidgets(actual); 

        if (!result.pass) { 
         result.message = 'dashboard is not displayed'; 
        } 

        return result; 
      } 
    } 
} 

Aggiungere il matcher al test corrente

jasmine.addMatchers(customMatchers); 

E poi nei test si può solo affermare con

expect(headerPage).toDisplayWidgets();