繁体   English   中英

如何使用 Chai 或 vanilla javascript 大致比较 JSON object 文字

[英]How to approximately compare JSON object literals using Chai or vanilla javascript

考虑 JSON object 文字的expected值和actual值:

        let expectedResult = {
                [0.9272952180016122, 1.1760052070951352, 1.0808390005411683],
                [1.2870022175865687, 0.8097835725701669,  1.240498971965643],
                [1.3494818844471053, 1.014197008784674,  1.3894765523934063]
            ],
            'spectrum': [
                [ 5, 13, 17],
                [25, 29, 37],
                [41, 53, 61]
            ]
        };

        let actualResult = {
                [0.9272952180016122, 1.1760052070951352, 1.0808390005411683],
                [1.2870022175865687, 0.8097835725701669,  1.240498971965643],
                [1.3494818844471053, 1.014197008784674,  1.3894765523934063]
            ],
            'spectrum': [
                [ 5, 13, 17],
                [25, 29, 37],
                [41, 53, 61]
            ]
        };

第二个条目不同: 1.17600520709513521.176005207095135 在 javascript 或 Chai 中是否有任何构造来处理这种比较?

以下不起作用,因为它最终成为 object 比较

    chai.expect(actualResult).to.be.closeTo(expectedResult);

AssertionError: expectedResult { Object (real, imag, ...) } 是一个数字

这个 function 显然是为chai5的。 https://github.com/chaijs/chai/issues/644

计划是在 Chai 5 中具有这种行为。欢迎您现在制作接受 Sinon 匹配器的插件 - 但要注意它可能在 Chai 5 推出时已经过时

在此期间,这是一个解决方法

我最终将@vaskevich 方法实现为插件。 它甚至替换了这个关于调用存根的可能令人困惑的文本。 这里是:

chai.use((_chai, utils) => {
  chai.Assertion.addMethod('matchEql', function fn(expectedMatch) {
    const subject = utils.flag(this, 'object');
    const stub = sinon.stub();
    stub(subject);
    try {
      sinon.assert.calledWithMatch(stub, expectedMatch);
    } catch (error) {
      error.name = 'MatchAssertionError';
      error.message = error.message.replace(
        /^expected stub to be called with match/,
        `expected ${utils.objDisplay(subject)} to match`
      );
      throw error;
    }
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM