Überprüfung der Objektgleichheit in Jasmine

Lesezeit: 2 Minuten

Benutzer-Avatar
Dan

Jasmin hat eingebaute Matcher toBe und toEqual. Wenn ich ein Objekt wie dieses habe:

function Money(amount, currency){
    this.amount = amount;
    this.currency = currency;

    this.sum = function (money){
        return new Money(200, "USD");
    }
}

und versuche zu vergleichen new Money(200, "USD") und das Ergebnis von sum funktionieren diese eingebauten Matcher nicht wie erwartet. Ich habe es geschafft, einen Workaround basierend auf einem Custom zu implementieren equals Methode und benutzerdefinierter Matcher, aber es scheint einfach zu viel Arbeit zu sein.

Was ist die Standardmethode zum Vergleichen von Objekten in Jasmine?

Benutzer-Avatar
lukas.pukenis

Ich habe nach demselben gesucht und einen bestehenden Weg gefunden, dies ohne benutzerdefinierten Code oder Matcher zu tun. Verwenden toEqual().

Wenn Sie Teilobjekte vergleichen möchten, sollten Sie Folgendes in Betracht ziehen:

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

vgl. jasmine.github.io/partial-matching

Dies ist das erwartete Verhalten, da zwei Instanzen eines Objekts in JavaScript nicht gleich sind.

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

Für einen sauberen Test sollten Sie einen eigenen Matcher schreiben, der vergleicht amount und currency:

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

Ich fand, dass lodash _.isEqual dafür gut ist

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

Ich habe es geschafft, zwei Objekte ohne benutzerdefinierten Code zu vergleichen über:

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

Hinweis : assert ist ein natives Node-Modul, hier muss nichts installiert werden

Benutzer-Avatar
Bär

Dein Problem ist die Wahrhaftigkeit. Sie versuchen, zwei verschiedene Instanzen eines Objekts zu vergleichen, das für reguläre Gleichheit wahr ist ( a == b ), aber nicht für strikte Gleichheit ( a === b ). Der Komparator, den Jasmin verwendet, ist
jasmine.Env.equals_() die nach strikter Gleichheit sucht.

Um das zu erreichen, was Sie brauchen, ohne Ihren Code zu ändern, können Sie die reguläre Gleichheit verwenden, indem Sie die Richtigkeit mit etwas wie dem Folgenden überprüfen:

expect(money1.sum() == money2.sum()).toBeTruthy();

1179440cookie-checkÜberprüfung der Objektgleichheit in Jasmine

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy