98 votes

Vérifier l'égalité des objets dans Jasmine

Jasmine a des comparateurs intégrés toBe y 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 essayer de comparer new Money(200, "USD") et le résultat de la somme, ces comparateurs intégrés ne fonctionneront pas comme prévu. J'ai réussi à mettre en place une solution de contournement basée sur une fonction personnalisée de equals método et des matrices personnalisées, mais cela semble représenter trop de travail.

Quelle est la manière standard de comparer des objets dans Jasmine ?

191voto

lukas.pukenis Points 3054

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

73voto

Devin Brown Points 317

Si vous cherchez à comparer des objets partiels, vous pouvez envisager de le faire :

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

3voto

Andreas Köberle Points 16453

C'est le comportement attendu, car deux instances d'un objet ne sont pas identiques 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 propre, vous devriez écrire votre propre matcher qui compare amount y currency :

beforeEach(function() {
  this.addMatchers({
    sameAmountOfMoney: function(expected) {
      return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
    }
  });
});

3voto

J'ai trouvé que lodash _.isEqual est bon pour cela

expect(_.isEqual(result, expectedResult)).toBeTruthy()

0voto

Ssh-uunen Points 180

J'ai réussi à comparer deux objets sans aucun code personnalisé via :

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

note : assert est un module natif de node, il n'est pas nécessaire d'installer quoi que ce soit ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X