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

标签 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 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)
  )
})

这有点用?更好,但需要我在测试文件中声明这个非常大的对象。这种非常深入的比较加上我的测试文件中的静态数据 block 对我来说很脆弱。有没有比我试过的更规范的方式

最佳答案

有很多方法可以做到这一点。最普通的方法是像 obj && obj.childObj && obj.childObject.anotherChild 一样显式检查,就像您在第一个示例中所做的那样。您还可以使用像 lodash 这样的库并使用 _.get(obj, 'childObj.anotherChild')。现在还有一个提议,向 javascript 添加一些语法,通过执行 obj?.childObj?.anotherChild 可以使这更容易,如果您使用的是 babel,babel 7 将支持转换该语法。

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

关于javascript - 如何在测试值或子对象之前测试父对象的存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948292/

相关文章:

css - 创建 React Portal 后,UploadCare 无法找到匹配选择器的 DOM 元素

javascript - JS/AJAX : Hide/Show select boxes

node.js - webpack/webpack-dev-server/react 在应该显示应用程序时显示目录列表

javascript - 在express.js中为每个请求设置全局res.local变量

javascript - react : The existing value of my text input gets cleared when onChange event occurs

reactjs - 为什么我得到 'Map' 不是从 'react-leaflet' 导出的?

javascript - 我如何在小部分中停止我的代码并且我的 if 和 else 语句不起作用

javascript - 本地主机协议(protocol)不匹配

javascript - 每行开头和结尾的填充相同

node.js - 是否有用于 nodejs(connect、express)的基于 cookie 的 session 存储?