web-dev-qa-db-ja.com

ジャスミンでオブジェクトの平等を確認する

Jasmine には、組み込みのマッチャーtoBeおよびtoEqualがあります。このようなオブジェクトがある場合:

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

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

new Money(200, "USD")とsumの結果を比較しようとすると、これらの組み込みマッチャーは期待どおりに機能しません。カスタム equals method とカスタムマッチャーに基づいて回避策を実装できましたが、うまくいくようです。

ジャスミンのオブジェクトを比較する標準的な方法は何ですか?

78
Dan

私は同じものを探していましたが、カスタムコードやマッチャーを使わずに既存の方法を見つけました。 toEqual()を使用します。

160
lukas.pukenis

部分的なオブジェクトを比較する場合は、次のことを検討できます。

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

55
obfk

オブジェクトの2つのインスタンスが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

クリーンテストを行うには、amountcurrencyを比較する独自のマッチャーを作成する必要があります。

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