使用Jest测试是否存在深层嵌套属性的最佳方法是什么。尝试定位我想要的特定对象会得到一个未定义的错误,因为它的父对象不存在:
curl
我应该以某种方式链接这些,以便我可以先测试对象的存在,然后测试内部对象的存在吗?相当于在if语句中执行类似的操作
test('returns data from `server/index.js`', () => {
const data = axios.get(httpObj)
.then(data, => {
expect(data.els[4]).not.toBeNull()
// ^ TypeError: Cannot read property '4' of undefined
})
})
或者在对这样的一个元素进行多次测试时,是否应该进行单独的测试?
if (obj && obj[4] && obj[4].hasOwnProperty('myProp')) {
// pass
}
我也尝试过:
test('returns data from `server/index.js`', () => {
const data = axios.get(httpObj)
.then(data, => {
expect(data).not.toBeNull()
})
})
test('data returned from `server/index.js` api contains my property', () => {
const data = axios.get(httpObj)
.then(data, => {
expect(data.els[4]).not.toBeNull()
})
})
这有点工作吗?更好,但要求我在测试文件中声明这个非常大的对象。这个非常深入的比较与我的测试文件中的静态blob数据相结合,对我来说感觉很脆弱。是否有比我尝试过的更规范的方式
答案 0 :(得分:1)
有很多方法可以做到这一点。最流露的方式就是像你在第一个例子中那样明确地检查obj && obj.childObj && obj.childObject.anotherChild
。您也可以使用像lodash这样的库并使用_.get(obj, 'childObj.anotherChild')
。现在还有一个建议是为javascript添加一些语法,如果你使用babel,那么通过obj?.childObj?.anotherChild
可以使这更容易,babel 7将支持转换语法。
就实际测试数据而言,我认为您可以安全地假设您的数据在测试中的外观。通过单独测试每个属性会遇到的危险是,如果您的数据因任何原因而改变形状,您需要修复更多测试,而不是仅仅在一个测试中假设您的数据将是什么样的。