Jasmine.js membandingkan array

205

Apakah ada cara di jasmine.js untuk memeriksa apakah dua array sama, misalnya:

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

Sepertinya tidak ada yang berhasil.

pengguna2032804
sumber

Jawaban:

341

Baru saja melakukan tes dan berhasil toEqual

tolong temukan tes saya:

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

Hanya untuk informasi:

toBe () versus toEqual (): toEqual () memeriksa kesetaraan. toBe (), di sisi lain, memastikan bahwa mereka adalah objek yang sama persis.

TheEwook
sumber
Hm, terima kasih, sepertinya masalahnya adalah array yang saya bandingkan dimodifikasi, jadi ia melakukan sesuatu seperti arr = [1, 2, 3] arr ['pop'] = function () {...} harapkan (arr) .toEquals ([1, 2, 3])
user2032804
2
bagaimana menguji apakah nilainya sama dengan epsilon? misal, pengujian saya gagal Diharapkan [-9, -6, 6, 3, 1.0000000000000004, 2] sama dengan [-9, -6, 6, 3, 1, 2].
morpheus
@morpheus - Saya sudah mencoba toBeCloseTo(expected,2)tetapi sepertinya tidak berhasil.
cod3monk3y
argumen kedua toBeCloseTo adalah # tempat desimal yang akan dibandingkan.
morpheus
1
ini jatuh pada "==" dalam javascript secara default. Ini tidak aman karena tidak hanya nilai aktual dibandingkan, tetapi seluruh objek.
Peter
0

Anda dapat membandingkan array seperti yang disebutkan di bawah ini jika array memiliki beberapa nilai

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

Tetapi jika array yang dikembalikan dari beberapa fungsi memiliki lebih dari 1 elemen dan semuanya nol maka verifikasi dengan menggunakan

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

hanya untuk catatan Anda selalu dapat membandingkan menggunakan 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]));

Semua selerasa, ini juga akan berfungsi untuk objek literal yang kompleks

Ohad Sadan
sumber
mengapa kita membutuhkan perbedaan antara toBe dan toEqual?
Luca Borrione
tidak ada perbedaan, saya hanya ingin membiarkannya terlihat seperti pertanyaan
Ohad Sadan
Ada perbedaan antara toBe dan toEqual yang OP tidak yakin. Jawaban harus menjelaskan hal-hal, daripada menunjukkan penggunaan yang tidak tepat. Jawaban yang diterima sudah berisi semuanya, jawaban Anda berpotensi menimbulkan lebih banyak kebingungan yang menunjukkan cara memaksa melati untuk bekerja dengan cara yang tidak dimaksudkan untuk bekerja.
Luca Borrione
-4

Saya punya masalah serupa di mana salah satu array dimodifikasi. Saya menggunakannya untuk $httpBackend, dan objek yang dikembalikan dari itu sebenarnya adalah $promiseobjek yang berisi array (bukan Arrayobjek).

Anda dapat membuat pencocokan melati untuk mencocokkan array dengan membuat toBeArrayfungsi:

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

Dan kemudian gunakan saja dalam tes Anda seperti pencocokan melati lainnya:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
antimateri
sumber
2
Saya mendapatkan TypeError: this.addMatchers bukan fungsi
AndyTheEntity
4
Fungsi "arraysAreSame" yang Anda berikan akan memberikan false positive untuk array x=[1,2], y=[1,2,3]karena hanya memeriksa x.lengthelemen pertama . Anda dapat memperbaikinya dengan memeriksa if (x.length !== y.length) { return false; }sebelumnya.
warchinal
1
@AndyTheEntity "Fungsi addMatchers tidak lagi pada spec (ini) sekarang pada objek melati global." - Lihat Jasmine docs
rwisch45
for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang
@warchinal lucu, juga gagal menangkap expect([1]).toBeArray([2]). Dan juga array lainnya, karenaundefined + 1 => NaN
André Werlang