检查Jasmine中的对象相等性

时间:2013-05-06 14:45:23

标签: javascript bdd jasmine object-comparison

Jasmine内置了匹配器toBetoEqual。如果我有这样的对象:

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

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

并尝试比较new Money(200, "USD")和sum的结果,这些内置匹配器将无法按预期工作。我已经设法实现了基于自定义equals method和自定义匹配器的解决方案,但它似乎很有效。

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

6 个答案:

答案 0 :(得分:155)

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

答案 1 :(得分:50)

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

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

比照jasmine.github.io/partial-matching

答案 2 :(得分: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

要进行干净的测试,您应该编写自己的匹配器,比较amountcurrency

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

答案 3 :(得分:2)

我发现lodash _.isEqual对此很有帮助

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

答案 4 :(得分:0)

我设法在没有任何自定义代码的情况下比较了两个对象:

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

注意:assert 是原生节点模块,这里不需要安装任何东西

答案 5 :(得分:-2)

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

要在不更改代码的情况下完成所需的操作,您可以通过使用类似以下内容检查真实性来使用常规相等:

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