如何在测试值或子项之前测试父对象的存在

时间:2017-08-29 21:03:32

标签: javascript node.js reactjs testing jestjs

使用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数据相结合,对我来说感觉很脆弱。是否有比我尝试过的更规范的方式

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。最流露的方式就是像你在第一个例子中那样明确地检查obj && obj.childObj && obj.childObject.anotherChild。您也可以使用像lodash这样的库并使用_.get(obj, 'childObj.anotherChild')。现在还有一个建议是为javascript添加一些语法,如果你使用babel,那么通过obj?.childObj?.anotherChild可以使这更容易,babel 7将支持转换语法。

就实际测试数据而言,我认为您可以安全地假设您的数据在测试中的外观。通过单独测试每个属性会遇到的危险是,如果您的数据因任何原因而改变形状,您需要修复更多测试,而不是仅仅在一个测试中假设您的数据将是什么样的。