2013-07-17 14 views
10

In Chai, si può fare cose come la seguente:Come funzionano le librerie di asserzioni come Chai senza forzare una chiamata a una funzione?

expect({}).to.exist; 

exist non è una chiamata di funzione, ma questo funziona ancora nel framework di test. Il contrario (expect({}).to.not.exist) causa il fallimento dei test, ma ancora una volta, exist non è una chiamata di funzione.

Come funzionano queste asserzioni senza farmi chiamare una funzione? Infatti, se provo a dire expect({}).to.exist() il test fallisce perché exist non è una funzione.

risposta

10

L'ho capito (o almeno, ho scoperto il metodo a). Utilizzare JavaScript getters:

var throws = { 
    get a() { 
    throw new Error('a'); 
    }, 
    get b() { 
    throw new Error('b'); 
    }, 
    get c() { 
    throw new Error('c'); 
    } 
}; 

Nel fare throws.a, throws.b o throws.c, verrà generato l'errore appropriato.

Da quel punto è piuttosto facile costruire le asserzioni contenute in Chai.

+0

Come lo spiega? Questo è un grande salto senza spiegare cosa succede nel mezzo – vsync

+1

L'articolo collegato aiuta davvero a spiegare le cose se non hai familiarità con i getter. La versione breve è che, grazie ai nuovi miglioramenti del browser (-ish), ora puoi controllare una proprietà oltre la semplice impostazione (ad esempio 'a.b = 5'). Ora è possibile definire un metodo "getter" per una proprietà e quando un codice tenta di leggere il valore di tale proprietà (ad esempio 'console.log (a.b)') il browser eseguirà il metodo definito "getter". Questo metodo può quindi attivare la logica (ad esempio la logica di asserzione di Chai). Quindi, quando si esegue un 'to.exist', anche se non c'è nessun'() 'dopo * si * sta ancora chiamando un metodo (il metodo getter). – machineghost

Problemi correlati