Controllo dell'uguaglianza degli oggetti in Jasmine


87

Jasmine ha matcher incorporati toBee toEqual. Se ho un oggetto come questo:

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

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

e prova a confrontare new Money(200, "USD")e il risultato della somma, questi abbinamenti incorporati non funzioneranno come previsto. Sono riuscito a implementare una soluzione basata su un equalsmetodo personalizzato e un abbinamento personalizzato, ma sembra che funzioni molto.

Qual è il modo standard per confrontare gli oggetti in Jasmine?

Risposte:


174

Stavo cercando la stessa cosa e ho trovato un modo esistente per farlo senza alcun codice personalizzato o abbinamenti. Usa toEqual().


63

Se stai cercando di confrontare oggetti parziali, potresti considerare:

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

cfr. jasmine.github.io/partial-matching


3

È il comportamento previsto, poiché due istanze di un oggetto non sono le stesse in 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

Per un test pulito dovresti scrivere il tuo matcher che confronta amounte currency:

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

2

Ho scoperto che lodash _.isEqual va bene per questo

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

-4

Il tuo problema è con la verità. Stai cercando di confrontare due diverse istanze di un oggetto che è vero per l'uguaglianza regolare (a == b) ma non vero per l'uguaglianza rigorosa (a === b). Il comparatore utilizzato da jasmine è jasmine.Env.equals_ () che cerca l'uguaglianza rigorosa.

Per ottenere ciò di cui hai bisogno senza modificare il codice, puoi utilizzare l'uguaglianza regolare verificando la veridicità con qualcosa di simile al seguente:

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

9
Quello che hai detto riguardo ==ed ===è completamente sbagliato. Due diverse istanze di un oggetto con lo stesso contenuto restituiranno entrambe false. Per tutti i non primitivi ==e si ===comportano in modo identico. jsfiddle.net/9mrmyrs6
Juan Mendes

@JuanMendes controlla la risposta di Andreas K. ... voi ragazzi state dicendo due cose diverse. È questa una differenza nel rinnovare un oggetto rispetto a un oggetto letterale?
pherris

@pherris mmm .... sì, stiamo dicendo cose diverse: sto dicendo che quando si confrontano le non primitive, non importa se si usa ==o ===, non è coinvolta la coercizione. Andreas sta dicendo che puoi creare un abbinamento personalizzato. L'ultima affermazione su come risolvere questo problema è "corretta" ma la spiegazione nel primo paragrafo è semplicemente errata. jasminecontrollerà effettivamente il contenuto dell'oggetto se si utilizza al toBe()posto diequals
Juan Mendes

a == bdarà ancora false se ae bsono casi diversi, potresti voler modificare la tua risposta
Louie Almeda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.