当通过json string vs builder创建对象时,Javascript深层对象相等

时间:2016-04-27 19:41:47

标签: javascript json builder chai should.js

我有一些调用HTTP API的测试。我已经嘲笑他们并使用构建器来创建相关的JSON,以便提供更多的意义。我在其他语言中使用了类似的模式,我试图在javascript中使用它。

我遇到的问题是,即使我通过构建器创建的内容和我手动构造的json对象看起来(对我来说)相同,但它们并不像js那样。

我已经联系了一个小提琴,希望能够清楚地理解:https://jsfiddle.net/sp89cc95/

我的构建器如下:

var PersonBuilder = function() {
    this.name = "Bob"
  this.age = 25
  this.hobbies = ["Coding"]
}

PersonBuilder.prototype.withName = function(name) {
    this.name = name;
  return this;
}

PersonBuilder.prototype.withAge = function(age) {
    this.age = age;
  return this;
}

PersonBuilder.prototype.withHobby = function(hobby) {
    this.hobbies = [hobby]
  return this;
}

PersonBuilder.prototype.addHobby = function(hobby) {
    this.hobbies.push(hobby)
  return this;
}

然后我的测试设置就是

var builder = new PersonBuilder();
var expected = {
  "name": "Bob",
  "age": 25,
  "hobbies": ["Coding"]
}

断言:

builder.should.eql(expected);

这个断言失败了。当我检查对象时,它们都打印

{"name":"Bob","age":25,"hobbies":["Coding"]}

我从调试中得到的结论是阵列导致问题。当我console.log显示对象时[Object]。但是,如果我只记录数组,我会得到['Coding']

我可以手动提取数组的内容并比较它们的相等性,但我认为should.eql的深度相等检查会对我有用。

非常感谢任何帮助。如果有更好的方法来编写构建器或测试它们的输出,我会全力以赴。这是从几个小时的谷歌搜索和一些试验和错误发现的解决方案。我确信它很简单,我只是错过了。

提前致谢

1 个答案:

答案 0 :(得分:2)

缺乏平等可能是由于原型方法,尝试添加构建方法,该方法使用属性创建对象而没有原型方法。