使用 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/