2015-11-16 8 views
6

Sto scrivendo alcuni test con chai e chai-come-promesso (e più framework, ma non importa in questo caso) e ho bisogno di controllare se array ottengo da una pagina web è uguale a un array predefinito. Ho provato ad usare expect(arrayFromPage).to.eventually.deep.equal(predefinedArray), ma non funzionerà, perché l'ordine degli elementi sulla pagina è a volte diverso (che è OK, non ho bisogno di controllare se sono nello stesso ordine).Confronto degli array nel chai

Ho trovato un modo per risolvere il problema utilizzando expect(listFromPage).to.eventually.include.all.members(predefinedArray), ma mi piacerebbe sapere se c'è una soluzione migliore.

Ciò che mi infastidisce di più nella mia soluzione, è che assicuro solo che predefinedArray è sottoinsieme di listFromPage, non che sono fatti di stessi elementi.

Così, mi piacerebbe sapere se v'è un'asserzione che passerà per [1,2,3] e [3,2,1], ma non per [1] e [1,2,3] o [1,2,3,4] e [1,2,3].

So che posso usare qualche seconda aspettativa (confrontare le lunghezze, o qualcos'altro), ma mi piacerebbe sapere se c'è una soluzione a una linea.

risposta

12

Visto che questo è stato contrassegnato come risolto in precedenza, ho provato a fare la stessa cosa nella risposta accettata. Probabilmente ha funzionato allora, ma non sembra funzionare più:

expect([1, 2, 3, 4]).to.have.all.members([2, 4, 3, 1]); 

dà il seguente errore:

AssertionError: expected 1 to be an array 

ho fatto un po 'più di ricerca e trovato una richiesta di pull che ha aggiunto questa funzionalità indietro nel 2013:

https://github.com/chaijs/chai/pull/153

Quindi il modo ufficiale di fare questo ora è come questo:

expect([1, 2, 3, 4]).to.have.same.members([2, 4, 3, 1]); 

Per completezza, ecco l'errore che due insiemi differenti produce:

AssertionError: expected [ 1, 2, 3, 4 ] to have the same members as [ 4, 3, 1 ] 

Spero che questo aiuti chiunque cerchi la stessa risposta ora. :-)

+0

Qualche idea sul perché ha funzionato nel mese di agosto '16 se questa richiesta di pull è stata unita nel '13? – Alissa

+0

No. Ma se scavassimo in profondità i commit, allora forse hanno fatto in modo che non funzionasse perché non era mai stato previsto un po 'di tempo tra allora e ora. :-) – sindrenm

2

È possibile farlo con 2 linee:

expect(listFromPage).to.eventually.include.all.members(predefinedArray) 
expect(predefinedArray).to.eventually.include.all.members(listFromPage) 

Con questo, potrete controllare se entrambi gli array contiene gli stessi valori. Ma l'ordine non ha importanza.

+0

Io non sono sicuro se funziona, come 'listFromPage' è una matrice di promesse e 'predefinitoArray' è una matrice di valori. Potrei confrontare le lunghezze degli array, ma mi chiedo se esiste una soluzione a una linea. – Alissa

+0

Esiste una soluzione a una riga che utilizza "have", come descritto nell'altra risposta. –

4

Non è completamente chiaro dalla documentazione, ma il .to.have.all.members sembra funzionare. Potrei solo trovare una menzione di questa funzionalità per .keys, ma sembra che funzioni anche per .members con gli array.

+0

Vuoi dire che 'expect ([1,2,3,4]). To.have.all.members ([1,2,3])' fallirà? Perché ho bisogno che fallisca in questo caso ed è la preoccupazione principale sull'uso di 'to.have.all.members' – Alissa

+0

Sì, esattamente:' expect ([1, 2, 3, 4]). To.have.all .members ([2, 3, 1, 4]) 'riesce, ma' expect ([1, 2, 3] 4) to.have.all.members ([1, 2, 3]) 'fallisce con 'AssertionError: expected [1, 2, 3, 4] per avere gli stessi membri di [1, 2, 3]' – pdenes

+0

Questo probabilmente ha funzionato nel momento in cui lo hai scritto, ma da allora ha smesso di funzionare. Vedi [la mia risposta] (http://stackoverflow.com/a/42972555/664955) per un esempio di lavoro corrente. :-) – sindrenm

1

Dal futuro, il modo in cui ha lavorato per me, è stato quello di utilizzare .deepEqual che ha fatto il trucco per me

assert.deepEqual(['name'], ['name'], 'this must be same to proceed');