Jasmine.js confrontando le matrici


205

Esiste un modo in jasmine.js per verificare se due array sono uguali, ad esempio:

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

Nessuno dei due sembra funzionare.

Risposte:


341

Ho appena fatto il test e funziona con toEqual

per favore trova il mio 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]);
    });
});

Solo per informazione:

toBe () versus toEqual (): toEqual () controlla l'equivalenza. toBe (), d'altra parte, si assicura che siano esattamente lo stesso oggetto.


Hm, grazie, sembra che il problema sia che l'array con cui sto confrontando viene modificato, quindi fa qualcosa come arr = [1, 2, 3] arr ['pop'] = function () {...} prevedono (arr) .toEquals ([1, 2, 3])
user2032804

2
come verificare se i valori sono uguali all'interno di epsilon? ad esempio, il mio test fallisce Previsto [-9, -6, 6, 3, 1.0000000000000004, 2] uguale [-9, -6, 6, 3, 1, 2].
Morpheus,

@morpheus - Ci ho provato toBeCloseTo(expected,2)ma non sembra funzionare.
cod3monk3y

il secondo argomento di toBeCloseTo è il numero di posizioni decimali che verrà confrontato con.
Morpheus,

1
questo ricade su "==" in JavaScript per impostazione predefinita. Questo non è sicuro poiché non vengono confrontati solo i valori effettivi, ma l'intero oggetto.
Peter,

0

È possibile confrontare un array come quello indicato di seguito se l'array ha alcuni valori

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

Ma se l'array che viene restituito da una funzione ha più di 1 elementi e tutti sono zero, verificare usando

expect(mockArray[0]).toBe(0);

-3

solo per la cronaca puoi sempre confrontare utilizzando 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]));

È tutto metro di gusto, funzionerà anche per oggetti letterali complessi


perché allora avremmo bisogno di una differenza tra toBe e toEqual?
Luca Borrione,

non c'è differenza, volevo solo lasciare che sembrasse la domanda
Ohad Sadan,

C'è una differenza tra toBe e toEqual di cui l'OP non era sicuro. Una risposta dovrebbe chiarire le cose, piuttosto che mostrare un uso improprio. La risposta accettata contiene già tutto, la tua risposta introduce potenzialmente più confusione, mostrando come forzare il gelsomino a funzionare in un modo che non è destinato a funzionare.
Luca Borrione,

-4

Ho avuto un problema simile in cui uno degli array è stato modificato. Lo stavo usando per $httpBackend, e l'oggetto restituito da quello era in realtà un $promiseoggetto contenente l'array (non unArray oggetto).

È possibile creare un matcher jasmine per abbinare l'array creando una toBeArrayfunzione:

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 poi usalo nei tuoi test come gli altri match di gelsomini:

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

2
Ricevo TypeError: this.addMatchers non è una funzione
AndyTheEntity

4
La funzione "arraysAreSame" che hai fornito fornirà un falso positivo per gli array x=[1,2], y=[1,2,3]poiché controlla solo i primi x.lengthelementi. È possibile risolvere questo problema controllando in if (x.length !== y.length) { return false; }anticipo.
Warchinal,

1
@AndyTheEntity "La funzione addMatchers non è più sulla specifica (questa) è ora sull'oggetto jasmine globale." - vedi Jasmine docs
rwisch45

for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang il

@warchinal divertente, non riesce anche a catturare expect([1]).toBeArray([2]). E anche qualsiasi altro array davvero, perchéundefined + 1 => NaN
André Werlang il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.