Jasmine.js porównując tablice

205

Czy w jasmine.js istnieje sposób sprawdzenia, czy dwie tablice są równe, na przykład:

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

Żadne z nich nie działa.

użytkownik2032804
źródło

Odpowiedzi:

341

Właśnie wykonałem test i działa z toEqual

proszę znaleźć mój 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]);
    });
});

Tylko dla informacji:

toBe () versus toEqual (): toEqual () sprawdza równoważność. Z drugiej strony toBe () upewnia się, że są dokładnie tym samym obiektem.

TheEwook
źródło
Hm, dzięki, wygląda na to, że problem polega na tym, że tablica, z którą porównuję, jest zmodyfikowana, więc robi coś takiego jak arr = [1, 2, 3] arr ['pop'] = function () {...} expect (arr) .toEquals ([1, 2, 3])
2032804
2
jak sprawdzić, czy wartości są równe w epsilon? np. mój test kończy się niepowodzeniem Oczekiwano [-9, -6, 6, 3, 1.0000000000000004, 2] na równy [-9, -6, 6, 3, 1, 2].
Morfeusz
@morpheus - Próbowałem, toBeCloseTo(expected,2)ale wydaje się, że nie działa.
cod3monk3y
drugim argumentem toBeCloseTo jest liczba miejsc dziesiętnych, które będzie porównywać do góry.
Morfeusz
1
domyślnie pojawia się w „==” w javascript. Nie jest to po prostu bezpieczne, ponieważ porównywane są nie tylko rzeczywiste wartości, ale cały obiekt.
Peter,
0

Możesz porównać tablicę jak poniżej, jeśli tablica ma jakieś wartości

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

Ale jeśli tablica zwrócona przez jakąś funkcję ma więcej niż 1 element, a wszystkie są zerowe, to sprawdź za pomocą

expect(mockArray[0]).toBe(0);
Utkarsh Joshi
źródło
-3

tylko dla rekordu, zawsze możesz porównać używając 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]));

To wszystko metr smaku, będzie to również działać w przypadku złożonych obiektów dosłownych

Ohad Sadan
źródło
dlaczego więc potrzebowalibyśmy różnicy między toBe a toEqual?
Luca Borrione
nie ma różnicy, chciałbym tylko, aby wyglądało to na pytanie
Ohad Sadan,
Istnieje różnica między toBe a toEqual, o którym OP nie był pewien. Odpowiedź powinna wyjaśniać rzeczy, a nie pokazywać niewłaściwe użycie. Akceptowana odpowiedź zawiera już wszystko, twoja odpowiedź może wprowadzać więcej zamieszania, pokazując, jak zmusić jaśmin do pracy w sposób, który nie jest przeznaczony.
Luca Borrione
-4

Miałem podobny problem, gdy jedna z tablic została zmodyfikowana. Używałem go $httpBackend, a zwrócony z niego obiekt był w rzeczywistości $promiseobiektem zawierającym tablicę (a nie Arrayobiektem).

Możesz utworzyć dopasowujący jaśmin pasujący do tablicy, tworząc toBeArrayfunkcję:

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

A potem po prostu użyj go w swoich testach, tak jak innych dopasowujących jaśmin:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
antymateria
źródło
2
Dostaję TypeError: this.addMatchers nie jest funkcją
AndyTheEntity
4
Podana funkcja „arraysAreSame” da fałszywie dodatni wynik dla tablic x=[1,2], y=[1,2,3]ponieważ sprawdza tylko pierwsze x.lengthelementy. Możesz to naprawić, sprawdzając if (x.length !== y.length) { return false; }wcześniej.
warchinal
1
@AndyTheEntity „Funkcja addMatchers nie jest już dostępna w specyfikacji (ta), ale teraz w globalnym obiekcie jaśminu”. - patrz Jasmine docs
rwisch45
for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang,
@warchinal śmieszne, to również nie łapie expect([1]).toBeArray([2]). A także każda inna tablica naprawdę, ponieważundefined + 1 => NaN
André Werlang