Jasmine'de nesne eşitliğini kontrol etme


87

Jasmine yerleşik eşleştiricilere sahiptir toBeve toEqual. Böyle bir nesnem varsa:

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

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

ve new Money(200, "USD")toplamın sonucunu karşılaştırmaya çalışın , bu yerleşik eşleştiriciler beklendiği gibi çalışmayacaktır. Özel bir equalsyönteme ve özel eşleştiriciye dayalı bir çözüm oluşturmayı başardım , ancak bu çok iş gibi görünüyor.

Jasmine'deki nesneleri karşılaştırmanın standart yolu nedir?

Yanıtlar:


174

Aynı şeyi arıyordum ve herhangi bir özel kod veya eşleştirici olmadan bunu yapmanın mevcut bir yolunu buldum. Kullanın toEqual().


63

Kısmi nesneleri karşılaştırmak istiyorsanız, şunları düşünebilirsiniz:

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. yasemin.github.io/partial-matching


3

JavaScript'te bir nesnenin iki örneği aynı olmadığından, beklenen davranıştır.

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

Temiz bir test için bunu karşılaştırır kendi eşleyici yazmalı amountve currency:

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

2

Lodash _.isEqual'in bunun için iyi olduğunu buldum

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

-4

Senin sorunun dürüstlükle ilgili. Normal eşitlik için doğru olan (a == b) ancak katı eşitlik için doğru olmayan (a === b) bir nesnenin iki farklı örneğini karşılaştırmaya çalışıyorsunuz. Yasemin'in kullandığı karşılaştırıcı yasemindir.Env.equals_ () katı eşitliği arayan dir.

İhtiyaç duyduğunuz şeyi kodunuzu değiştirmeden başarmak için, aşağıdakine benzer bir şeyle doğruluğu kontrol ederek normal eşitliği kullanabilirsiniz:

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

9
Hakkında söylediğiniz ==ve ===tamamen yanlış. Aynı içeriğe sahip bir nesnenin iki farklı örneğinin her ikisi de yanlış döndürür. İlkel olmayanlar için ==ve ===aynı şekilde davranın. jsfiddle.net/9mrmyrs6
Juan Mendes

@JuanMendes Andreas K.'nin cevabına bir göz at ... Siz iki farklı şey söylüyorsunuz. Bu, bir nesneyi değişmez bir nesneye karşı yenileştirmede bir fark mıdır?
pherris

@pherris mmm .... evet farklı şeyler söylüyoruz: İlkel olmayanları karşılaştırırken, kullanıp kullanmamanız önemli değil , ==ya ===da herhangi bir zorlama söz konusu değil. Andreas, özel bir eşleştirici oluşturabileceğinizi söylüyor. Bu sorunun nasıl çözüleceğine dair son ifade "doğrudur" ancak ilk paragraftaki açıklama sadece yanlıştır. yerine jasminekullanırsanız nesne içeriğini kontrol edecektoBe()equals
Juan Mendes

a == bhala false verecek ave bfarklı örnekleri olan, size cevap düzenlemek isteyebilirsiniz
Louie Almeda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.