在Jasmine中检查对象相等


85

Jasmine具有内置的MatcherstoBetoEqual。如果我有这样的对象:

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

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

并尝试与new Money(200, "USD")和的结果进行比较,这些内置匹配器将无法按预期工作。我已经设法实现了基于自定义equals方法和自定义匹配器的变通方法,但这似乎需要很多工作。

在Jasmine中比较对象的标准方法是什么?

Answers:


172

我一直在寻找相同的东西,并且找到了一种无需任何自定义代码或匹配器的现有方法。使用toEqual()


63

如果要比较部分对象,则可以考虑:

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


3

它的预期行为,因为对象的两个实例在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

为了进行清晰的测试,您应该编写自己的匹配器,将其amount与和进行比较currency

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


-4

您的问题在于真实性。您正在尝试比较对象的两个不同实例,这对于正则相等(a == b)是正确的,但对于严格相等(a === b)则不正确。茉莉花使用的比较器是 jasmine.Env.equals_(),它寻找严格的相等性。

要在不更改代码的情况下完成所需的工作,可以使用正则相等性,方法是检查真实性,如下所示:

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

9
你说的对==,并===是完全错误的。具有相同内容的对象的两个不同实例都将返回false。对于任何非基元,=====行为相同。jsfiddle.net/9mrmyrs6
Juan Mendes

@JuanMendes查看Andreas K的答案。。。。。。。。。。。。更新对象与对象文字是否有区别?
pherris

@pherris mmm ....是的,我们说的是不同的话:我的意思是,在比较非原始函数时,无论使用==还是 ===,都没有强制性。Andreas说您可以创建一个自定义匹配器。关于如何解决此问题的最后一个陈述是“正确的”,但是第一段中的解释是错误的。jasmine如果您使用toBe()而不是,它将实际检查对象内容equals
Juan Mendes 2015年

a == b如果ab实例不同,仍然会给出错误,您可能需要编辑答案
Louie Almeda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.