【问题标题】:How to compare JavaScript objects in a unit test?如何在单元测试中比较 JavaScript 对象?
【发布时间】:2015-03-01 13:51:14
【问题描述】:

我想知道在单元测试中比较对象的正确方法。出于本示例的目的,我使用assertmocha 来测试一个简单的库mylib,其方法method 返回一个对象。

var assert = require("assert");
var mylib = require("../src/mylib");

describe("method", function() {
  it("does something clever and returns an object", function() {
    assert.equal(
      JSON.stringify({/* expected object */}), 
      JSON.stringify(mylib.method(["items", "in", "the", "list"])));
  });
});

以上方法可行,但我不知道使用JSON.stringify 是否是推荐的做法。我这样做对吗?

【问题讨论】:

    标签: javascript node.js unit-testing


    【解决方案1】:

    你不应该使用JSON.stringify,这种方法的问题是根据MDN JSON.stringify()

    不保证非数组对象的属性以任何特定顺序进行字符串化。不要依赖字符串化中同一对象内的属性排序。

    至此,您可以将{"a":2, "b":3}{"b":3, "a":2} 进行比较。

    您应该使用例如assert.deepEqual(老实说我从来没有用过assert,但从命名来看它应该是正确的函数)

    【讨论】:

    • assert.deepEqual 是正确的。哦,想想在我知道它在那里之前我经历过的体操。
    • 谢谢。 Node 的文档有点缺乏。不使用assert的任何特殊原因?
    • @JorgeBucaran 不,我更喜欢chai,因为它的风格有点冗长,例如expect(foo).to.deep.equal({ bar: 'baz' });expect(beverages).to.have.property('tea').with.length(3);。我认为非常适合 mocha 的风格。
    • @t.niese 我明白了。再次感谢。
    • expect(foo).to.deep.equal({ bar: 'baz' });为我工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多