Jasmine.js comparant des tableaux

205

Existe-t-il un moyen dans jasmine.js de vérifier si deux tableaux sont égaux, par exemple:

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

Aucun ne semble fonctionner.

user2032804
la source

Réponses:

341

Je viens de faire le test et ça marche avec toEqual

veuillez trouver mon 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]);
    });
});

Juste pour informations:

toBe () versus toEqual (): toEqual () vérifie l'équivalence. toBe (), d'autre part, s'assure qu'ils sont exactement le même objet.

TheEwook
la source
Hm, merci, il semble que le problème est que le tableau auquel je compare est modifié, donc il fait quelque chose comme arr = [1, 2, 3] arr ['pop'] = function () {...} attend (arr) .toEquals ([1, 2, 3])
user2032804
2
comment tester si les valeurs sont égales dans epsilon? par exemple, mon test échoue [-9, -6, 6, 3, 1.0000000000000004, 2] à [-9, -6, 6, 3, 1, 2].
morpheus
@morpheus - J'ai essayé toBeCloseTo(expected,2)mais cela ne semble pas fonctionner.
cod3monk3y
le deuxième argument de toBeCloseTo est le nombre de décimales qu'il comparera jusqu'à.
morpheus
1
cela revient par défaut à "==" en javascript. Ce n'est tout simplement pas sûr car non seulement les valeurs réelles sont comparées, mais tout l'objet.
Peter
0

Vous pouvez comparer un tableau comme celui mentionné ci-dessous si le tableau a des valeurs

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

Mais si le tableau renvoyé par une fonction a plus de 1 éléments et que tous sont nuls, vérifiez en utilisant

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

juste pour l'enregistrement, vous pouvez toujours comparer en utilisant JSON.stringify

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]));

C'est tout mètre de goût, cela fonctionnera également pour les objets littéraux complexes

Ohad Sadan
la source
pourquoi aurions-nous alors besoin d'une différence entre toBe et toEqual?
Luca Borrione
il n'y a pas de différence, je voulais juste que ça ressemble à la question
Ohad Sadan
Il y a une différence entre toBe et toEqual dont l'OP n'était pas sûr. Une réponse devrait clarifier les choses, plutôt que de montrer une mauvaise utilisation. La réponse acceptée contient déjà tout, votre réponse introduit potentiellement plus de confusion montrant comment forcer le jasmin à fonctionner d'une manière qui n'est pas destinée à fonctionner.
Luca Borrione
-4

J'ai eu un problème similaire où l'un des tableaux a été modifié. Je l'utilisais pour $httpBackend, et l'objet renvoyé de celui-ci était en fait un $promiseobjet contenant le tableau (pas un Arrayobjet).

Vous pouvez créer un matcher de jasmin pour correspondre au tableau en créant une toBeArrayfonction:

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);
    }
  });
});

Et puis il suffit de l'utiliser dans vos tests comme les autres matchers au jasmin:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
antimatière
la source
2
Je reçois TypeError: this.addMatchers n'est pas une fonction
AndyTheEntity
4
La fonction "arraysAreSame" que vous avez fournie donnera un faux positif pour les tableaux x=[1,2], y=[1,2,3]car elle ne vérifie que les premiers x.lengthéléments. Vous pouvez résoudre ce problème en vérifiant if (x.length !== y.length) { return false; }au préalable.
warchinal
1
@AndyTheEntity "La fonction addMatchers n'est plus sur la spécification (cela), elle est maintenant sur l'objet global jasmine." - voir les documents Jasmine
rwisch45
for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang
@warchinal drôle, il ne parvient pas non plus à attraper expect([1]).toBeArray([2]). Et aussi tout autre tableau vraiment, carundefined + 1 => NaN
André Werlang