Jasmine에서 개체 평등 확인


85

Jasmine 에는 매처 toBetoEqual. 다음과 같은 개체가있는 경우 :

function Money(amount, currency){
    this.amount = amount;
    this.currency = currency;

    this.sum = function (money){
        return new Money(200, "USD");
    }
}

비교 new Money(200, "USD")하고 합계의 결과를 시도하면 이러한 내장 매 처가 예상대로 작동하지 않습니다. 사용자 지정 equals메서드 및 사용자 지정 매처를 기반으로 한 해결 방법 을 구현 했지만 많은 효과가있는 것 같습니다.

Jasmine에서 물체를 비교하는 표준 방법은 무엇입니까?

답변:


172

나는 똑같은 것을 찾고 있었고 사용자 정의 코드 또는 매처없이 그렇게 할 수있는 기존 방법을 찾았습니다. 사용 toEqual().


63

부분 개체를 비교하려는 경우 다음을 고려할 수 있습니다.

describe("jasmine.objectContaining", function() {
  var foo;

  beforeEach(function() {
    foo = {
      a: 1,
      b: 2,
      bar: "baz"
    };
  });

  it("matches objects with the expect key/value pairs", function() {
    expect(foo).toEqual(jasmine.objectContaining({
      bar: "baz"
    }));
  });
});

cf. jasmine.github.io/partial-matching


3

객체의 두 인스턴스가 JavaScript에서 동일하지 않기 때문에 예상되는 동작입니다.

function Money(amount, currency){
  this.amount = amount;
  this.currency = currency;

  this.sum = function (money){
    return new Money(200, "USD");
  }
}

var a = new Money(200, "USD")
var b = a.sum();

console.log(a == b) //false
console.log(a === b) //false

깨끗한 테스트를 위해 당신은이 비교 자신의 정규 작성해야 amount하고 currency:

beforeEach(function() {
  this.addMatchers({
    sameAmountOfMoney: function(expected) {
      return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
    }
  });
});

2

lodash _.isEqual이 그에 적합하다는 것을 알았습니다.

expect(_.isEqual(result, expectedResult)).toBeTruthy()

-4

당신의 문제는 진실성에 있습니다. 일반 같음 (a == b)에 대해 참이지만 완전 같음 (a === b)에 대해서는 참이 아닌 객체의 두 인스턴스를 비교하려고합니다. 재스민이 사용하는 비교기는 엄격한 동등성을 찾는 jasmine.Env.equals_ () 입니다.

코드를 변경하지 않고 필요한 작업을 수행하려면 다음과 같이 진실성을 확인하여 정규 동등성을 사용할 수 있습니다.

expect(money1.sum() == money2.sum()).toBeTruthy();

9
당신이 말한 ==것과 ===완전히 잘못되었습니다. 동일한 내용을 가진 객체의 두 가지 다른 인스턴스는 모두 false를 반환합니다. 비 프리미티브를 들어, =====동일하게 동작합니다. jsfiddle.net/9mrmyrs6
Juan Mendes

@JuanMendes는 Andreas K의 답변을 확인합니다. ... 여러분은 두 가지 다른 말을하고 있습니다. 이것이 객체를 새로 만드는 것과 객체 리터럴의 차이입니까?
pherris

@pherris 음 .... 그래 우리는 다른 것을 말하고있다 : 나는 비 프리미티브를 비교할 때, 당신이 사용 여부를 중요하지 않습니다 것을 말하고 ==또는 ===, 반군 강제가 없습니다. Andreas는 사용자 정의 매처를 만들 수 있다고 말합니다. 이 문제를 해결하는 방법에 대한 마지막 설명은 "올바른"것이지만 첫 번째 단락의 설명은 잘못된 것입니다. jasmine당신이 사용하는 경우 실제로 개체 내용을 확인합니다 toBe()대신equals
후안 멘데스

a == b여전히 경우는 false 줄 것이다 ab다른 인스턴스가, 당신은 당신의 대답을 편집 할 수 있습니다
루이 Almeda에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.