Checking object equality in Jasmine
Solution 1
I was looking for the same thing and found an existing way to do so without any custom code or matchers. Use toEqual()
.
Solution 2
If you're looking to compare partial objects, you might consider:
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
Solution 3
I found that lodash _.isEqual is good for that
expect(_.isEqual(result, expectedResult)).toBeTruthy()
Solution 4
Its the expected behavior, as two instances of an object are not the same in 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
For a clean test you should write your own matcher that compares amount
and currency
:
beforeEach(function() {
this.addMatchers({
sameAmountOfMoney: function(expected) {
return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
}
});
});
Dan
Updated on June 22, 2021Comments
-
Dan about 3 years
Jasmine has built-in matchers
toBe
andtoEqual
. If I have an object like this:function Money(amount, currency){ this.amount = amount; this.currency = currency; this.sum = function (money){ return new Money(200, "USD"); } }
and try to compare
new Money(200, "USD")
and the result of sum, these built-in matchers will not work as expected. I have managed to implement a work-around based on a customequals
method and custom matcher, but it just seems to much work.What is the standard way to compare objects in Jasmine?
-
Ruan Mendes over 9 yearsWhat you said about
==
and===
is completely wrong. Two different instances of an object with the same content will both return false. For any non-primitives,==
and===
behave identically. jsfiddle.net/9mrmyrs6 -
pherris over 8 years@JuanMendes check out the answer by Andreas K. ... you guys are saying two different things. Is this a difference in newing up an object vs an object literal?
-
Ruan Mendes over 8 years@pherris mmm....yes we are saying different things: I'm saying that when comparing non-primitives, it doesn't matter whether you use
==
or===
, there is no coercion involved. Andreas is saying that you can create a custom matcher. The last statement on how to fix this problem is "correct" but the explanation in the first paragraph is just incorrect.jasmine
will actually check object contents if you usetoBe()
instead ofequals
-
Louie Almeda about 8 years
a == b
will still give false ifa
andb
are different instances, you might want to edit your answer