Jasmine a des correspondants intégrés toBe
et toEqual
. Si j'ai un objet comme celui-ci:
function Money(amount, currency){
this.amount = amount;
this.currency = currency;
this.sum = function (money){
return new Money(200, "USD");
}
}
et essayez de comparer new Money(200, "USD")
et le résultat de sum, ces matchers intégrés ne fonctionneront pas comme prévu. J'ai réussi à implémenter une solution de contournement basée sur une méthode personnalisée equals
) et personnalisée, mais cela me semble trop demander.
Quelle est la méthode standard pour comparer des objets dans Jasmine?
Je cherchais la même chose et ai trouvé un moyen existant de le faire sans code personnalisé ni correspondants. Utilisez toEqual()
.
Si vous cherchez à comparer des objets partiels, vous pouvez envisager:
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"
}));
});
});
C'est le comportement attendu, car deux instances d'un objet ne sont pas les mêmes en 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
Pour un test complet, vous devriez écrire votre propre matcher qui compare amount
et currency
:
beforeEach(function() {
this.addMatchers({
sameAmountOfMoney: function(expected) {
return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
}
});
});