【问题标题】:Checking object equality in Jasmine检查 Jasmine 中的对象相等性
【发布时间】:2013-05-06 14:45:22
【问题描述】:

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 中比较对象的标准方法是什么?

【问题讨论】:

    标签: javascript bdd jasmine object-comparison


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

        【解决方案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;
            }
          });
        });
        

        【讨论】:

          【解决方案4】:

          我发现 lodash _.isEqual 有好处

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

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

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

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

              【讨论】:

              • 你所说的===== 是完全错误的。具有相同内容的对象的两个不同实例都将返回 false。对于任何非基元,===== 的行为相同。 jsfiddle.net/9mrmyrs6
              • @JuanMendes 查看 Andreas K 的答案。...你们说的是两件不同的事情。这是新对象与对象字面量的区别吗?
              • @pherris mmm....是的,我们在说不同的东西:我是说,在比较非基元时,使用 ===== 都没有关系,那里不涉及强制。 Andreas 说您可以创建自定义匹配器。关于如何解决此问题的最后陈述是“正确的”,但第一段中的解释是不正确的。如果您使用toBe() 而不是equalsjasmine 将实际检查对象内容
              • 如果ab 是不同的实例,a == b 仍会给出 false,您可能需要编辑答案
              猜你喜欢
              • 1970-01-01
              • 2015-07-19
              • 2016-04-18
              • 2012-06-23
              • 2014-11-14
              • 1970-01-01
              • 2019-06-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多