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

Jasmine a des éléments encastré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 essayer de comparer new Money(200, "USD") et le résultat de la somme, ces matches intégrés ne fonctionnera pas comme prévu. J'ai réussi à mettre en œuvre un work-around basé sur un personnalisé equals méthode et matcher personnalisé, mais il semble juste à beaucoup de travail.

Quelle est la voie standard pour comparer des objets dans le Jasmin?

71
demandé sur Community 2013-05-06 18:45:22

4 réponses

je cherchais la même chose et trouvé une façon de le faire sans aucun code personnalisé ou de rapprochement. Utilisez toEqual() .

146
répondu lukas.pukenis 2014-12-05 09:57:39

si vous cherchez à comparer des objets partiels, vous pourriez considérer:

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 / correspondance partielle

44
répondu obfk 2015-02-11 19:50:57

est le comportement attendu, comme deux instances d'un objet ne sont pas les mêmes dans 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 devez é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
répondu Andreas Köberle 2013-05-06 19:36:20

votre problème est la vérité. Vous essayez de comparer deux instances différentes d'un objet qui est vrai pour l'égalité régulière ( a == b ) mais pas pour l'égalité stricte ( a === b). Le comparateur utilisé par jasmine est jasmin.Env.equals_ () qui cherche l'égalité stricte.

pour accomplir ce que vous avez besoin sans changer votre code, vous pouvez utiliser l'égalité régulière en vérifiant la vérité avec quelque chose un peu comme le

expect(money1.sum() == money2.sum()).toBeTruthy();
-1
répondu Baer 2013-05-09 05:46:08