배열을 비교하는 Jasmine.js


205

jasmine.js에 두 개의 배열이 같은지 확인하는 방법이 있습니까?

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

둘 다 작동하지 않는 것 같습니다.

답변:


341

그냥 테스트를했고 그것은 작동합니다 toEqual

내 테스트를 찾으십시오.

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

정보를 위해서만 :

toBe () 대 toEqual () : toEqual ()은 동등성을 검사합니다. 반면에 toBe ()는 그것들이 정확히 같은 객체인지 확인합니다.


흠, 고마워, 문제는 내가 비교하고있는 배열이 수정 된 것이므로 arr = [1, 2, 3] arr [ 'pop'] = function () {...} expect (arr) .toEquals ([1, 2, 3])
user2032804

2
엡실론 내에서 값이 같은지 테스트하는 방법은 무엇입니까? 예를 들어, 제 테스트는 [-9, -6, 6, 3, 1, 2]와 같은 예상 [-9, -6, 6, 3, 1.0000000000000004, 2]에 실패합니다.
morpheus 2019

@morpheus-시도 toBeCloseTo(expected,2)했지만 작동하지 않는 것 같습니다.
cod3monk3y

toBeCloseTo의 두 번째 인수는 비교할 소수점 이하 자릿수입니다.
morpheus

1
이것은 기본적으로 자바 스크립트에서 "=="로 대체됩니다. 실제 값뿐만 아니라 전체 객체가 비교되기 때문에 안전하지 않습니다.
피터

0

배열에 값이있는 경우 아래에 언급 된 것과 같은 배열을 비교할 수 있습니다

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

그러나 일부 함수에서 반환 된 배열에 둘 이상의 요소가 있고 모두 0이면 다음을 사용하여 확인하십시오.

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

-3

레코드를 위해 항상 JSON을 사용하여 비교할 수 있습니다.

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

그것은 모든 맛의 미터입니다. 이것은 복잡한 리터럴 객체에서도 작동합니다.


왜 우리는 toBe와 toEqual의 차이가 필요할까요?
Luca Borrione

차이는, 난 그냥 질문처럼 보일 수 있도록이 wante'd하지 않습니다
오핫 Sadan

OP가 확실치 않은 toBe와 toEqual에는 차이가 있습니다. 대답은 부적절하게 사용하기보다는 사물을 명확히해야합니다. 수락 된 답변에는 이미 모든 것이 포함되어 있으며, 답변에 따라 재스민이 작동하지 않는 방식으로 작동하도록 강제하는 방법을 더 혼란스럽게 소개 할 수 있습니다.
Luca Borrione

-4

배열 중 하나가 수정되는 비슷한 문제가 있습니다. 에 사용하고 $httpBackend있었고 그에서 반환 된 객체는 실제로 $promise배열을 포함 하는 객체 였습니다 (Array .

toBeArray함수 를 생성하여 배열과 일치하는 자스민 매처를 만들 수 있습니다 .

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

그런 다음 다른 자스민 매처와 같은 테스트에서 사용하십시오.

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

2
TypeError가 발생합니다 : this.addMatchers는 함수가 아닙니다
AndyTheEntity

4
귀하가 제공 한 "arraysAreSame"기능은 배열에 대한 오 탐지를 줄 것이다 x=[1,2], y=[1,2,3]그 첫 번째 검사 이후 x.length요소를. if (x.length !== y.length) { return false; }미리 확인하여이 문제를 해결할 수 있습니다 .
warchinal

1
@AndyTheEntity "addMatchers 함수는 더 이상 스펙에 있지 않습니다 (이것은 이제 글로벌 자스민 오브젝트에 있습니다)."
-Jasmine

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

@ warchinal 재미, 그것은 또한 잡을 수 없습니다 expect([1]).toBeArray([2]). 또한 다른 배열도 있습니다.undefined + 1 => NaN
André Werlang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.