Javascript 通过 json 字符串 vs 生成器创建对象时的深度对象相等性
Javascript deep object equality when object created via json string vs builder
我有一些调用 HTTP API 的测试。我已经嘲笑了他们并正在使用构建器来创建相关的 JSON 以提供更多含义。我在其他语言中使用过类似的模式,我正试图在 javascript.
中使用它
我遇到的问题是,即使我通过构建器创建的对象和我手动构造的 json 对象看起来(对我来说)相等,但就 js 而言,它们并不相同。
我已经链接了一个 fiddle,希望它足够清晰易懂:https://jsfiddle.net/sp89cc95/
我的builder如下:
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
的深度相等性检查可以为我做到这一点。
如有任何帮助,我们将不胜感激。如果有更好的方法来编写构建器或测试他们的输出,我会洗耳恭听。这是通过几个小时的谷歌搜索和一些反复试验找到的解决方案。我确定它很简单,我只是想念它。
提前致谢
不相等可能是由于原型方法,尝试添加创建具有属性但没有原型方法的对象的构建方法。
我有一些调用 HTTP API 的测试。我已经嘲笑了他们并正在使用构建器来创建相关的 JSON 以提供更多含义。我在其他语言中使用过类似的模式,我正试图在 javascript.
中使用它我遇到的问题是,即使我通过构建器创建的对象和我手动构造的 json 对象看起来(对我来说)相等,但就 js 而言,它们并不相同。
我已经链接了一个 fiddle,希望它足够清晰易懂:https://jsfiddle.net/sp89cc95/
我的builder如下:
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
的深度相等性检查可以为我做到这一点。
如有任何帮助,我们将不胜感激。如果有更好的方法来编写构建器或测试他们的输出,我会洗耳恭听。这是通过几个小时的谷歌搜索和一些反复试验找到的解决方案。我确定它很简单,我只是想念它。
提前致谢
不相等可能是由于原型方法,尝试添加创建具有属性但没有原型方法的对象的构建方法。