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 とカスタムマッチャーに基づいて回避策を実装できましたが、うまくいくようです。
ジャスミンのオブジェクトを比較する標準的な方法は何ですか?
私は同じものを探していましたが、カスタムコードやマッチャーを使わずに既存の方法を見つけました。 toEqual()
を使用します。
部分的なオブジェクトを比較する場合は、次のことを検討できます。
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"
}));
});
});
オブジェクトの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;
}
});
});