【问题标题】:chai test array equality doesn't work as expectedchai 测试数组相等不能按预期工作
【发布时间】:2013-07-08 12:38:08
【问题描述】:

为什么下面会失败?

expect([0,0]).to.equal([0,0]);

什么是正确的测试方法?

【问题讨论】:

    标签: node.js mocha.js chai


    【解决方案1】:

    对于expect.equal 将比较对象而不是它们的数据,在您的情况下,它是两个不同的数组。

    使用.eql 来深入比较值。看看这个link
    或者您可以使用.deep.equal 来模拟.eql
    或者在您的情况下,您可能想要check .members

    对于断言,您可以使用.deepEquallink

    【讨论】:

    • FTR,深度相等语法已更改为:.deepEqual() (chaijs.com/api/assert)。
    • 它没有改变,您正在查看 Asserts 功能,而不是 Expect/Should 主题启动者关注的内容。
    • 你说得对,我没读好。我认为这只是另一个 API 更改。
    • to.deep.equal(['a','b']) 似乎不起作用。但是to.have.all.members(['a','b']) 可以。好麻烦……
    • chaijs.com/plugins/deep-equal-in-any-order 在对象属性的顺序不可预测时运行良好。
    【解决方案2】:

    尝试使用深度相等。它将比较嵌套数组和嵌套 Json。

    expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
    

    请参考main documentation site

    【讨论】:

    • 这也适用于数组:expect([1, 5, 10].sort()).to.deep.equal([1, 10, 5])
    【解决方案3】:

    对于无序的深度相等,使用 members

    expect([1,2,3]).to.have.members([3,2,1]); // passes expect([1,2,3]).to.have.members([1,2,3]); // passes expect([1,2,3]).to.eql([3,2,1]); // fails

    source

    【讨论】:

      【解决方案4】:

      您可以使用.deepEqual()

      const { assert } = require('chai');
      
      assert.deepEqual([0,0], [0,0]);
      

      【讨论】:

        【解决方案5】:
        import chai from 'chai';
        const arr1 = [2, 1];
        const arr2 = [2, 1];
        chai.expect(arr1).to.eql(arr2); // Will pass. `eql` is data compare instead of object compare.
        

        【讨论】:

          【解决方案6】:

          你可以使用

          https://www.chaijs.com/api/assert/#method_samedeepmembers

          assert.sameDeepMembers(set1, set2, [message])
          

          断言set1set2 具有任何顺序的相同成员。使用深度相等检查。

          assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members');
          

          【讨论】:

            【解决方案7】:

            这是使用 chai 深入测试关联数组的方法。

            我在尝试断言两个 关联 数组相等时遇到了问题。我知道这些实际上不应该在 javascript 中使用,但我正在围绕遗留代码编写单元测试,该代码返回对关联数组的引用。 :-)

            我通过在函数调用之前将变量定义为对象(而不是数组)来做到这一点:

            var myAssocArray = {};   // not []
            var expectedAssocArray = {};  // not []
            
            expectedAssocArray['myKey'] = 'something';
            expectedAssocArray['differentKey'] = 'something else';
            
            // legacy function which returns associate array reference
            myFunction(myAssocArray);
            
            assert.deepEqual(myAssocArray, expectedAssocArray,'compare two associative arrays');
            

            【讨论】:

              猜你喜欢
              • 2013-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-29
              • 1970-01-01
              • 1970-01-01
              • 2015-06-26
              • 2013-05-28
              相关资源
              最近更新 更多