Jasmine.js comparando matrizes

205

Existe uma maneira no jasmine.js de verificar se duas matrizes são iguais, por exemplo:

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

Nem parece funcionar.

user2032804
fonte

Respostas:

341

Acabei de fazer o teste e funciona com toEqual

por favor encontre o meu teste:

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

Apenas para informação:

toBe () versus toEqual (): toEqual () verifica a equivalência. toBe (), por outro lado, garante que eles sejam exatamente o mesmo objeto.

TheEwook
fonte
Hm, obrigado, parece que o problema é que a matriz com a qual estou comparando é modificada, então algo como arr = [1, 2, 3] arr ['pop'] = function () {...} expect (arr) .toEquals ([1, 2, 3])
user2032804 30/03
2
como testar se os valores são iguais no epsilon? por exemplo, meu teste falhou Esperado [-9, -6, 6, 3, 1.0000000000000004, 2] igual a [-9, -6, 6, 3, 1, 2].
morpheus
@morpheus - Eu tentei, toBeCloseTo(expected,2)mas não parece funcionar.
Cod3monk3y
o segundo argumento de toBeCloseTo é o número de casas decimais que ele irá comparar.
morpheus
1
isso recai em "==" em javascript por padrão. Isso simplesmente não é seguro, pois não apenas os valores reais são comparados, mas todo o objeto.
Peter
0

Você pode comparar uma matriz como a mencionada abaixo, se a matriz tiver alguns valores

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

Mas se a matriz retornada de alguma função tiver mais de 1 elementos e todos forem zero, verifique usando

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

apenas para o registro, você sempre pode 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]));

É tudo medidor de gosto, isso também funcionará para objetos literais complexos

Ohad Sadan
fonte
por que precisaríamos de uma diferença entre toBe e toEqual?
Luca Borrione
não há diferença, eu só wante'd para deixá-lo parecido com a questão
Ohad Sadan
Existe uma diferença entre toBe e toEqual em que o OP não tem certeza. Uma resposta deve esclarecer as coisas, em vez de mostrar um uso inadequado. A resposta aceita já contém tudo, sua resposta potencialmente introduz mais confusão, mostrando como forçar o jasmim a funcionar de uma maneira que não se destina a funcionar.
Luca Borrione
-4

Eu tive um problema semelhante em que uma das matrizes foi modificada. Eu o estava usando $httpBackende o objeto retornado era na verdade um $promiseobjeto contendo a matriz (não um objetoArray objeto).

Você pode criar um combinador de jasmim para corresponder à matriz criando uma toBeArrayfunção:

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

E, em seguida, basta usá-lo em seus testes como os outros jogadores de jasmim:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
antimatéria
fonte
2
Estou ficando TypeError: this.addMatchers não é uma função
AndyTheEntity
4
A função "arraysAreSame" que você forneceu fornecerá um falso positivo para as matrizes x=[1,2], y=[1,2,3]pois apenas verifica os primeiros x.lengthelementos. Você pode corrigir isso verificando if (x.length !== y.length) { return false; }antecipadamente.
warchinal
1
@AndyTheEntity "A função addMatchers não está mais na especificação (isto), agora está no objeto jasmim global." - consulte a documentação do Jasmine
rwisch45
for (var i; ...)=> x[undefined],var arraysAreSame = function ... var arraysAreSame = true :(
André Werlang
engraçado @warchinal, também não consegue pegar expect([1]).toBeArray([2]) . E também qualquer outra matriz realmente, porqueundefined + 1 => NaN
André Werlang