2013-07-08 9 views
165

Warum schlägt das folgende fehl?Chai Test Array-Gleichheit funktioniert nicht wie erwartet

expect([0,0]).to.equal([0,0]); 

und was ist der richtige Weg, um das zu testen?

+1

Sorry, aber das ist ein gutes Beispiel für den Grund, warum ich diese „fließend Sprache hasse "APIs. Es ist nicht Englisch: Es ist eine Art von einer abgeschlagenen Version von Semi-Englisch. Warum also so tun, als ob es Englisch ist? Für Nicht-Programmierer? Dann würde ich erwarten, dass es klarer und offensichtlicher ist, nicht weniger. "Es ist einfach, Sie verwenden 'gleich', um die Gleichheit zu testen ... oh, nicht für Arrays, weil es einen Objektvergleich durchführt ... nun, Arrays sind wie ein spezialisierter Objekttyp ... wissen Sie, verwenden Sie einfach eql für Arrays und mach dir keine Sorgen, warum. " Groß! – fool4jesus

Antwort

258

Für erwarten, .equal wird Objekte vergleichen, anstatt ihre Daten, und in Ihrem Fall ist es zwei verschiedene Arrays.

Verwenden Sie .eql, um Werte tief zu vergleichen. Überprüfen Sie diese link.
Oder Sie könnten .deep.equal verwenden, um das gleiche wie .eql zu simulieren.
Oder in Ihrem Fall möchten Sie vielleicht check.members.

Für bestätigt können Sie .deepEqual, link verwenden.

+2

FTR, die tiefe Gleichsyntax hat sich geändert in: '.deepEqual()' (http://chaijs.com/api/assert). – Ludder

+4

Es ist nicht geändert, Sie sehen ** bestätigt ** Funktionalität, aber nicht ** erwarten/sollte ** was Thema Starter besorgt war. – moka

+4

Sie haben Recht, ich habe nicht gut gelesen. Ich dachte, es ist nur eine weitere API-Änderung. – Ludder

39

Versuchen Sie tiefe Equal zu verwenden. Es wird verschachtelte Arrays sowie verschachtelte Json vergleichen.

expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); 

Bitte beziehen Sie sich auf main documentation site.

+4

Das funktioniert auch für Arrays: 'expect ([1, 5, 10] .sort()). to.deep.equal ([1, 10, 5])' – alxndr

-1

So verwenden Sie chai, um assoziative Arrays zu testen.

Ich hatte ein Problem versucht zu behaupten, dass zwei assoziative Arrays waren gleich. Ich weiß, dass diese nicht wirklich in Javascript verwendet werden sollten, aber ich schrieb Komponententests um Legacy-Code, der einen Verweis auf ein assoziatives Array zurückgibt. :-)

Ich habe es durch die Variable als ein Objekt (nicht Array), die vor meinem Funktionsaufruf:

var myAssocArray = {}; // not [] 
var expectedAssocArray = {}; // not [] 

expectedAssocArray['myKey'] = 'something'; 
expectedAssocArray['differentKey'] = 'something else'; 

// legacy function which returns associate array reference 
myFunction(myAssocArray); 

assert.deepEqual(myAssocArray, expectedAssocArray,'compare two associative arrays'); 
Verwandte Themen