2013-03-30 12 views
166

Gibt es eine Möglichkeit in jasmine.js zu überprüfen, ob zwei Arrays gleich sind, zum Beispiel:Jasmine.js Vergleich Arrays

arr = [1, 2, 3] 
expect(arr).toBe([1, 2, 3]) 
expect(arr).toEqual([1, 2, 3]) 

Weder scheint zu funktionieren.

Antwort

262

tat einfach den Test und es funktioniert mit toEqual

bitte meinen Test finden:

http://jsfiddle.net/7q9N7/3/

describe('toEqual', function() { 
    it('passes if arrays are equal', function() { 
     var arr = [1, 2, 3]; 
     expect(arr).toEqual([1, 2, 3]); 
    }); 
}); 

Nur zur Information:

toBe() versus toEqual(): toEqual() checks equivalence. toBe(), on the other hand, makes sure that they're the exact same object.

+0

Hm, danke Es scheint, dass das Problem darin besteht, dass das Array, mit dem ich vergleiche, modifiziert wird, also macht es etwas wie arr = [1, 2, 3] arr ['pop'] = function() {...} expect (arr) .toEquals ([1, 2, 3]) – user2032804

+1

Wie kann man testen, ob die Werte innerhalb von Epsilon gleich sind? Beispiel: Mein Test ist fehlgeschlagen. Erwartet [-9, -6, 6, 3, 1.0000000000000004, 2] entspricht [-9, -6, 6, 3, 1, 2]. – morpheus

+0

@morpheus - Ich habe versucht 'BeBeCloseTo (erwartet, 2) 'aber es scheint nicht zu funktionieren. – cod3monk3y

-1

ich hatte ähnlich Ein Problem, bei dem eines der Arrays geändert wurde. Ich benutzte es für $httpBackend, und das zurückgegebene Objekt von diesem war tatsächlich ein $promise Objekt, das das Array (kein Array Objekt) enthält.

Sie können einen Jasmin-Matcher erstellen, indem Sie eine toBeArray Funktion des Arrays entsprechen:

beforeEach(function() { 
    'use strict'; 
    this.addMatchers({ 
    toBeArray: function(array) { 
     this.message = function() { 
     return "Expected " + angular.mock.dump(this.actual) + " to be array " + angular.mock.dump(array) + "."; 
     }; 
     var arraysAreSame = function(x, y) { 
     var arraysAreSame = true; 
     for(var i; i < x.length; i++) 
      if(x[i] !== y[i]) 
       arraysAreSame = false; 
     return arraysAreSame; 
     }; 
     return arraysAreSame(this.actual, array); 
    } 
    }); 
}); 

Und dann einfach in Ihren Tests verwenden wie die anderen Jasmin-Matcher:

it('should compare arrays properly', function() { 
    var array1, array2; 
    /* . . . */ 
    expect(array1[0]).toBe(array2[0]); 
    expect(array1).toBeArray(array2); 
}); 
+2

Ich bekomme TypeError: this.addMatchers ist keine Funktion – AndyTheEntity

+4

Die "arraysAreSame" -Funktion, die Sie angegeben haben, wird ein falsches positives Ergebnis für die Arrays geben x = [1,2] ',' y = [1,2,3 ] 'da es nur die ersten' x.length' Elemente überprüft. Sie können dies beheben, indem Sie 'if (x.length! == y.length) {return false; } 'vorher. – warchinal

+1

@AndyTheEntity "Die Funktion addMatchers ist nicht mehr auf der Spezifikation (dies) es ist jetzt auf dem globalen Jasmin-Objekt." - siehe [Jasmine docs] (http://jasmine.github.io/2.0/upgrading.html) – rwisch45