我有一些调用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
的深度相等检查会对我有用。
非常感谢任何帮助。如果有更好的方法来编写构建器或测试它们的输出,我会全力以赴。这是从几个小时的谷歌搜索和一些试验和错误发现的解决方案。我确信它很简单,我只是错过了。
提前致谢
答案 0 :(得分:2)
缺乏平等可能是由于原型方法,尝试添加构建方法,该方法使用属性创建对象而没有原型方法。