Jasmine.js vergleicht Arrays

205

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

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

Beides scheint nicht zu funktionieren.

user2032804
quelle

Antworten:

341

Habe gerade den Test gemacht und es funktioniert mit toEqual

Bitte finden Sie meinen Test:

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 () prüft die Äquivalenz. toBe () stellt andererseits sicher, dass es sich genau um dasselbe Objekt handelt.

TheEwook
quelle
Hm, danke, es scheint, dass das Problem darin besteht, dass das Array, mit dem ich vergleiche, geändert wurde, also macht es so etwas wie arr = [1, 2, 3] arr ['pop'] = function () {...} Erwarten Sie (arr) .toEquals ([1, 2, 3])
user2032804
2
Wie teste ich, ob die Werte innerhalb von Epsilon gleich sind? Beispiel: Mein Test schlägt fehl. Erwartet [-9, -6, 6, 3, 1.0000000000000004, 2] entspricht [-9, -6, 6, 3, 1, 2].
Morpheus
@morpheus - Ich habe es versucht, toBeCloseTo(expected,2)aber es scheint nicht zu funktionieren.
cod3monk3y
Das zweite Argument von toBeCloseTo ist die Anzahl der Dezimalstellen, mit denen verglichen wird.
Morpheus
1
Dies greift standardmäßig auf "==" in Javascript zurück. Dies ist einfach nicht sicher, da nicht nur die tatsächlichen Werte verglichen werden, sondern das gesamte Objekt.
Peter
0

Sie können ein Array wie das unten erwähnte vergleichen, wenn das Array einige Werte hat

it('should check if the array are equal', function() {
        var mockArr = [1, 2, 3];
        expect(mockArr ).toEqual([1, 2, 3]);
 });

Wenn das von einer Funktion zurückgegebene Array jedoch mehr als 1 Elemente enthält und alle Null sind, überprüfen Sie dies mithilfe von

expect(mockArray[0]).toBe(0);
Utkarsh Joshi
quelle
-3

Nur für den Datensatz können Sie immer mit JSON.stringify vergleichen

const arr = [1,2,3]; expect(JSON.stringify(arr)).toBe(JSON.stringify([1,2,3])); expect(JSON.stringify(arr)).toEqual(JSON.stringify([1,2,3]));

Es ist alles Meter Geschmack, dies funktioniert auch für komplexe wörtliche Objekte

Ohad Sadan
quelle
warum brauchen wir dann einen Unterschied zwischen toBe und toEqual?
Luca Borrione
Es gibt keinen Unterschied, ich möchte nur, dass es so aussieht wie die Frage
Ohad Sadan,
Es gibt einen Unterschied zwischen toBe und toEqual, bei dem sich das OP nicht sicher war. Eine Antwort sollte die Dinge klarstellen, anstatt eine missbräuchliche Verwendung aufzuzeigen. Die akzeptierte Antwort enthält bereits alles. Ihre Antwort führt möglicherweise zu mehr Verwirrung darüber, wie Jasmin gezwungen werden kann, so zu arbeiten, dass es nicht funktionieren soll.
Luca Borrione
-4

Ich hatte ein ähnliches Problem, bei dem eines der Arrays geändert wurde. Ich habe es für verwendet $httpBackend, und das zurückgegebene Objekt davon war tatsächlich ein $promiseObjekt, das das Array enthielt (keinArray Objekt).

Sie können einen Jasmin-Matcher erstellen, der dem Array entspricht, indem Sie eine toBeArrayFunktion erstellen :

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 verwenden Sie es einfach in Ihren Tests wie die anderen Jasmin-Matcher:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
Antimaterie
quelle
2
Ich bekomme TypeError: this.addMatchers ist keine Funktion
AndyTheEntity
4
Die von Ihnen bereitgestellte Funktion "arraysAreSame" gibt ein falsches Positiv für die Arrays aus x=[1,2], y=[1,2,3]da nur die ersten x.lengthElemente überprüft werden. Sie können dies beheben, indem Sie dies if (x.length !== y.length) { return false; }vorher überprüfen .
Warchinal
1
@AndyTheEntity "Die Funktion addMatchers befindet sich nicht mehr in der Spezifikation (dies), sondern jetzt im globalen Jasminobjekt." - siehe Jasmine docs
rwisch45
for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang
@warchinal lustig, es fängt auch nicht zu fangen expect([1]).toBeArray([2]). Und auch wirklich jedes andere Array, weilundefined + 1 => NaN
André Werlang