Jasmine.js so sánh mảng


205

Có cách nào trong jasmine.js để kiểm tra xem hai mảng có bằng nhau không, ví dụ:

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

Cả hai dường như không làm việc.

Câu trả lời:


341

Chỉ cần làm bài kiểm tra và nó hoạt động với toEqual

vui lòng tìm bài kiểm tra của tôi:

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

Chỉ để biết thông tin:

toBe () so với toEqual (): toEqual () kiểm tra tính tương đương. toBe (), mặt khác, đảm bảo rằng chúng là cùng một đối tượng.


Hừm, cảm ơn, có vẻ như vấn đề là mảng tôi đang so sánh đã bị sửa đổi, vì vậy nó làm một cái gì đó như Array = [1, 2, 3] Array ['pop'] = function () {...} mong đợi (mảng) .toEquals ([1, 2, 3])
user2032804

2
Làm thế nào để kiểm tra nếu các giá trị bằng nhau trong epsilon? ví dụ: thử nghiệm của tôi không thành công Dự kiến ​​[-9, -6, 6, 3, 1.0000000000000004, 2] bằng [-9, -6, 6, 3, 1, 2].
morpheus

@morpheus - Tôi đã thử toBeCloseTo(expected,2)nhưng có vẻ như không hoạt động.
cod3monk3y

đối số thứ hai của toBeCloseTo là # vị trí thập phân mà nó sẽ so sánh tối đa.
morpheus

1
cái này rơi trở lại vào "==" trong javascript theo mặc định. Điều này chỉ không an toàn vì không chỉ các giá trị thực tế được so sánh, mà toàn bộ đối tượng.
Peter

0

Bạn có thể so sánh một mảng như được đề cập dưới đây nếu mảng có một số giá trị

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

Nhưng nếu mảng được trả về từ một số hàm có nhiều hơn 1 phần tử và tất cả đều bằng 0 thì hãy xác minh bằng cách sử dụng

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

-3

chỉ với bản ghi mà bạn luôn có thể so sánh bằng cách sử dụng JSON.opesify

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

Đó là tất cả các hương vị, điều này cũng sẽ làm việc cho các đối tượng nghĩa đen phức tạp


Tại sao chúng ta lại cần một sự khác biệt giữa toBe và toEqual?
Luca Borrione

không có gì khác biệt, tôi chỉ muốn để nó giống như câu hỏi
Ohad Sadan

Có một sự khác biệt giữa toBe và toEqual mà OP không chắc chắn. Một câu trả lời nên làm rõ mọi thứ, thay vì hiển thị sử dụng không đúng cách. Câu trả lời được chấp nhận đã chứa tất cả, câu trả lời của bạn có khả năng gây ra nhiều nhầm lẫn hơn cho thấy cách buộc hoa nhài hoạt động theo cách mà nó không có ý định hoạt động.
Luca Borrione

-4

Tôi đã có một vấn đề tương tự trong đó một trong các mảng đã được sửa đổi. Tôi đã sử dụng nó cho $httpBackendvà đối tượng được trả về từ đó thực sự là một $promiseđối tượng có chứa mảng (không phải là một Arrayđối tượng).

Bạn có thể tạo một công cụ ghép hoa nhài để khớp với mảng bằng cách tạo một toBeArrayhàm:

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

Và sau đó chỉ cần sử dụng nó trong các thử nghiệm của bạn như các que diêm hoa nhài khác:

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

2
Tôi đang nhận TypeError: this.addMatchers không phải là một chức năng
AndyTheEntity

4
Hàm "ArrayaysAreSame" mà bạn đã cung cấp sẽ cho kết quả dương tính giả cho các mảng x=[1,2], y=[1,2,3]vì nó chỉ kiểm tra các x.lengthphần tử đầu tiên . Bạn có thể khắc phục điều này bằng cách kiểm tra if (x.length !== y.length) { return false; }trước.
Warchinal

1
@AndyTheEntity "Hàm addMatchers không còn trên spec (cái này) mà bây giờ nó nằm trên đối tượng hoa nhài toàn cầu." - xem tài liệu của Jasmine
rwisch45

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

@warchinal buồn cười, nó cũng không bắt được expect([1]).toBeArray([2]). Và bất kỳ mảng nào khác thực sự, bởi vìundefined + 1 => NaN
André Werlang 6/12/17
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.