ジャスミンでオブジェクトの同等性をチェックする


87

ジャスミンにはマッチャー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")合計の結果を比較しようとすると、これらの組み込みマッチャーは期待どおりに機能しません。カスタムequalsメソッドとカスタムマッチャーに基づいて回避策を実装することができましたが、それはかなりの作業のようです。

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

回答:


174

私は同じことを探していて、カスタムコードやマッチャーなしでそうするための既存の方法を見つけました。を使用し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

オブジェクトの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

きれいなテストのためには、比較し、独自のマッチャー書くべきamountとのcurrency

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


-4

あなたの問題は真実性にあります。オブジェクトの2つの異なるインスタンスを比較しようとしています。これは、通常の等式(a == b)には当てはまりますが、厳密な等式(a === b)には当てはまりません。jasmineが使用するコンパレータは jasmine.Env.equals_()であり、厳密な同等性を探します。

コードを変更せずに必要なことを達成するには、次のようなもので真実性をチェックすることにより、通常の等式を使用できます。

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

9
あなたが言ったこと=====完全に間違っています。同じコンテンツを持つオブジェクトの2つの異なるインスタンスは、両方ともfalseを返します。非プリミティブの場合=====同じように動作します。jsfiddle.net/9mrmyrs6
Juan Mendes

@JuanMendesはAndreasKによる回答をチェックしてください...皆さんは2つの異なることを言っています。これは、オブジェクトの新規作成とオブジェクトリテラルの違いですか?
pherris 2015年

@pherrisうーん....はい、私たちはさまざまなことを言っている:私は非プリミティブを比較するとき、それはあなたが使用するかどうか問題ではないことを言っている=====、関連する一切強制はありません。アンドレアスは、カスタムマッチャーを作成できると言っています。この問題を修正する方法に関する最後のステートメントは「正しい」ですが、最初の段落の説明は正しくありません。代わりにjasmine使用すると、実際にオブジェクトの内容がチェックされますtoBe()equals
Juan Mendes

a == babが異なるインスタンスである場合でもfalseが返されますが、回答を編集することをお勧めします
Louie Almeda 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.