javascript - 开玩笑比较对象。细绳
问题描述
我在开玩笑中收到了这个结果
result1 -> {
"partyRoleIdentifier": {
"internalEmployeeIdentifier": {
"id": "id-modified"
}
}
}
我做这个比较:
expect(result).toBe('{\"partyRoleIdentifier\": {\"internalEmployeeIdentifier\": {\"id\": \"id-modified\"}}}');
但我得到了这个结果:
Expected: "{\"partyRoleIdentifier\": {\"internalEmployeeIdentifier\": {\"id\": \"id-modified\"}}}"
Received: {"partyRoleIdentifier": {"internalEmployeeIdentifier": {"id": "id-modified"}}}
解决方案
首先,您将字符串与对象进行比较(result
是 JS 对象,expected
而是字符串)。如果您不想将 JSON 字符串转换为对象,则需要使用 JSON.parse 函数。
let strObj = "{\"foo\":\"bar\"}"
// you can't access object properties from string:
strObj.foo // undefined
let obj = {"foo":"bar"}
obj.foo // "bar"
let parsed = JSON.parse(strObj)
parsed.foo // "bar"
其次,因为在JS中对象是通过引用来比较的,这段代码是比较期望引用和接收到的引用是否指向同一个对象实例
let a = {foo: "bar"}
let b = {foo: "bar"}
a == b // false
在你的情况下使用expect(result).toMatchObject(expected)
. 这将检查对象是否与预期的结构和值匹配(执行深度比较)。
就像在开玩笑的文档中一样
用于
.toMatchObject
检查 JavaScript 对象是否匹配对象属性的子集。它会将接收到的对象与不在预期对象中的属性进行匹配。
因此,您的代码可能会如下所示:
expect(result).toMatchObject({
partyRoleIdentifier: {
internalEmployeeIdentifier: {
id: "id-modified"
}
}
})
推荐阅读
- sql - 政府统计的 ER 图
- java - 未发送 Alfresco 工作流程通知电子邮件
- database - 在 Tableau 中将 PostgreSQL 嵌套 JSON 转换为数值数组
- ruby-on-rails - SSL证书getaddrinfo:名称或服务未知(SocketError)Rails-4.2.0
- swift - 访问对象内部的值
- android - Android dagger2,有些东西不清楚
- thorntail - thorntail 中的 projects_default.yml 文件
- powerbi - 如何检查自定义列中的许多条件
- php - 控制器数据未传递给模型 | 代码点火器
- mysql - 不考虑0am~4am之间的时差。MySQL