我下面有json
{
"menu": {
"sections": [
{
"type": 4,
"frames": [
{
"itens": []
}
],
"order": 0
},
{
"type": 4,
"frames": [
{
"itens": [
{
"id": "1719016",
"type": 0,
"free": false
}
]
}
],
"order": 1
}
]
}
}
和下面的测试可以检查数组itens
中的所有json itens是否具有ID属性:
expect_json_keys('menu.sections.0.frames.*.itens.*', :id)
问题是此测试运行良好。但应该失败。
仅当我将期望值更改为该值时,我的测试才会失败:
expect_json_keys('menu.sections.0.frames.*.itens.0', :id)
为什么在使用itens.*
时此测试成功而不是失败
答案 0 :(得分:1)
我转载了您的问题,并尝试进行调试。
我是第一次看到这种机载宝石(所以下面是一粒盐),但是我认为问题在于机载实施本身,更确切地说是:https://github.com/brooklynDev/airborne/blob/master/lib/airborne/path_matcher.rb#L82 >
此行用于对与通配符段匹配的每个项目运行期望块(在这种情况下为this one),但是对于空数组,它只是不执行任何操作。没有期望-没有失败。
因此,在您的测试代码中这没什么错,这与gem本身有关。 作为一种解决方法,您可以尝试使用smth。类似于以下内容:
expect_json_types('menu.sections.0.frames.*.itens', :array_of_objects) # <= add this
expect_json_keys('menu.sections.0.frames.*.itens.*', :id)
例如在测试值本身之前测试值的类型-在这种情况下,它会失败并显示Expected array_of_objects got Array instead
答案 1 :(得分:0)
非常感谢@ konstantin-strukov。此解决方案适用于该测试案例。
但是在某些测试案例中,我仍然必须编写一些额外的代码。
您对此json http://www.mocky.io/v2/5c827f26310000e8421d1e83编写的期望失败。好的,我有一个测试案例,它应该真的失败了。我将在许多用例中使用您的解决方案。再次谢谢你。
但是,如果我有至少一个填充的itens
属性(http://www.mocky.io/v2/5c827f26310000e8421d1e83),我有一些测试用例应该不会失败。 expect_json_keys('menu.sections.0.frames.*.itens.?', :id)
应该足够了,但是还不够,因为它可以使用itens.*
或itens.?
来工作。我已尝试将您的解决方案适合这些测试用例,但未按预期工作。