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

Javascript 如何在测试值或子对象之前测试父对象的存在性,javascript,node.js,reactjs,testing,jestjs,Javascript,Node.js,Reactjs,Testing,Jestjs,使用Jest测试深层嵌套属性是否存在的最佳方法是什么。尝试以我想要的特定对象为目标将导致未定义的错误,因为其父对象不存在: test('returns data from `server/index.js`', () => { const data = axios.get(httpObj) .then(data, => { expect(data.els[4]).not.toBeNull() // ^ TypeError: Cannot

使用Jest测试深层嵌套属性是否存在的最佳方法是什么。尝试以我想要的特定对象为目标将导致未定义的错误,因为其父对象不存在:

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语句中执行类似操作

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() 
  })
})
我也尝试过:

const expected = {/* very large object */}
test('returns data from `server/index.js` and it contains an array containing the `expected` object', () => {
  expect(data.els[4]).toEqual(
    expect.objectContaining(expected)
  )
})

这有点用?更好,但是需要在测试文件中声明这个非常大的对象。这种非常深入的比较,再加上测试文件中的静态数据块,让我觉得很脆弱。有没有比我尝试过的更规范的方法?有很多方法可以做到这一点。最普通的方法是像您在第一个示例中所做的那样,显式地检查像
obj&&obj.childObj&&obj.childObject.anotherChild
。您还可以使用像lodash这样的库并使用
\uj.get(obj,'childObj.anotherChild')
。现在还有一个建议,就是在javascript中添加一些语法,通过执行
obj?.childObj?.anotherChild
来简化这一过程。如果您使用的是babel,babel 7将支持转换该语法


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

在测试文件中包含lodash这样的第三方库,这是一个相当标准的做法吗?看起来你可能只是想使用测试框架,但确实是一个选择。我没有看到使用babel编译
obj?.childObj?.anotherChild
语法,即使使用stage-0选项。无论如何,我认为你关于数据的观点是好的。这应该相当稳定,所以我想我会选择我的第三个选择。感谢您的输入。巴别塔7将支持
?。
。巴别塔7还没有发布,但我相信现在已经进入测试阶段。至于在测试文件中使用库,我认为这是相当标准的。事实上,有许多库被设计用来帮助进行流线测试,比如如果您使用的是react,则使用react test utils,或者使用nock来帮助模拟请求。