Jasmine.js comparando matrices

205

¿Hay alguna manera en jasmine.js para verificar si dos matrices son iguales, por ejemplo:

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

Ninguno de los dos parece funcionar.

usuario2032804
fuente

Respuestas:

341

Acabo de hacer la prueba y funciona con toEqual

por favor encuentre mi prueba:

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

Solo para información:

toBe () versus toEqual (): toEqual () verifica la equivalencia. toBe (), por otro lado, se asegura de que sean exactamente el mismo objeto.

TheEwook
fuente
Hm, gracias, parece que el problema es que la matriz con la que estoy comparando está modificada, por lo que hace algo así como arr = [1, 2, 3] arr ['pop'] = function () {...} expect (arr) .toEquals ([1, 2, 3])
usuario2032804
2
¿Cómo probar si los valores son iguales dentro de epsilon? por ejemplo, mi prueba falla Esperado [-9, -6, 6, 3, 1.0000000000000004, 2] igual a [-9, -6, 6, 3, 1, 2].
morfeo
@morpheus: lo he intentado toBeCloseTo(expected,2)pero no parece funcionar.
cod3monk3y
El segundo argumento de toBeCloseTo es el número de lugares decimales con los que se comparará.
morfeo
1
esto recae en "==" en javascript por defecto. Esto no es seguro ya que no solo se comparan los valores reales, sino todo el objeto.
Peter
0

Puede comparar una matriz como la que se menciona a continuación si la matriz tiene algunos valores

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

Pero si la matriz que se devuelve de alguna función tiene más de 1 elementos y todos son cero, verifique usando

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

solo para el registro que siempre puedes comparar usando 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]));

Todo es metro de gusto, esto también funcionará para objetos literales complejos

Ohad Sadan
fuente
¿por qué necesitaríamos una diferencia entre toBe y toEqual entonces?
Luca Borrione
no hay diferencia, solo quería que pareciera la pregunta
Ohad Sadan
Hay una diferencia entre toBe y toEqual sobre la que el OP no estaba seguro. Una respuesta debería aclarar las cosas, en lugar de mostrar un uso inadecuado. La respuesta aceptada ya lo contiene todo, su respuesta potencialmente introduce más confusión que muestra cómo obligar al jazmín a trabajar de una manera que no está destinada a funcionar.
Luca Borrione el
-4

Tuve un problema similar en el que se modificó una de las matrices. Lo estaba usando para $httpBackend, y el objeto devuelto de ese era en realidad un $promiseobjeto que contenía la matriz (no un Arrayobjeto).

Puede crear un emparejador de jazmín para que coincida con la matriz creando una toBeArrayfunción:

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

Y luego simplemente úsalo en tus pruebas como los otros emparejadores de jazmín:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
antimateria
fuente
2
Recibo TypeError: this.addMatchers no es una función
AndyTheEntity
44
La función "arraysAreSame" que ha proporcionado dará un falso positivo para las matrices x=[1,2], y=[1,2,3]ya que solo verifica los primeros x.lengthelementos. Puede solucionar esto comprobando de if (x.length !== y.length) { return false; }antemano.
warchinal
1
@AndyTheEntity "La función addMatchers ya no está en la especificación (esto) ahora está en el objeto de jazmín global". - ver documentos de Jasmine
rwisch45
for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang
@warchinal divertido, también falla al atrapar expect([1]).toBeArray([2]). Y también cualquier otra matriz realmente, porqueundefined + 1 => NaN
André Werlang