93

Jasmineには組み込みのマッチャーtoBetoEqual. 次のようなオブジェクトがある場合:

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

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

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

Jasmine でオブジェクトを比較する標準的な方法は何ですか?

4

6 に答える 6

185

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

于 2013-07-05T08:45:01.827 に答える
69

部分的なオブジェクトを比較する場合は、次のことを検討してください。

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

参照。jasmine.github.io/部分一致

于 2015-02-11T19:50:57.223 に答える
3

JavaScript ではオブジェクトの 2 つのインスタンスが同じではないため、これは予期される動作です。

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;
    }
  });
});
于 2013-05-06T19:36:20.900 に答える
0

次の方法で、カスタム コードを使用せずに 2 つのオブジェクトを比較することができました。

import { deepStrictEqual } from 'assert'
// ...
expect(deepStrictEqual.bind(null, objectA, objectB)).not.toThrow()

注:assertネイティブノードモジュールです。ここに何もインストールする必要はありません

于 2021-06-21T14:03:53.183 に答える
-5

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

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

expect(money1.sum() == money2.sum()).toBeTruthy();
于 2013-05-09T05:46:08.380 に答える