web-dev-qa-db-fra.com

Vérification de l'égalité des objets dans Jasmine

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?

78
Dan

Je cherchais la même chose et ai trouvé un moyen existant de le faire sans code personnalisé ni correspondants. Utilisez toEqual().

160
lukas.pukenis

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

cf. jasmine.github.io/partial-matching

55
obfk

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