Ruby Airbone 阵列测试未按预期工作



我在下面有json

{
"menu": {
"sections": [
{
"type": 4,
"frames": [
{
"itens": []
}
],
"order": 0
},
{
"type": 4,
"frames": [
{
"itens": [
{
"id": "1719016",
"type": 0,
"free": false
}
]
}
],
"order": 1
}
]
}
}

下面的测试可能会检查数组itens中的所有 JSON ITEN 是否都具有 ID 属性:

expect_json_keys('menu.sections.0.frames.*.itens.*', :id)

问题是这个测试运行良好。但应该失败。

只有当我将期望更改为以下值时,我的测试才会失败:

expect_json_keys('menu.sections.0.frames.*.itens.0', :id)

为什么此测试在使用itens.*时成功而不是失败

我重现了您的问题并尝试进行一些调试。

我第一次看到这个机载宝石(所以对以下内容持保留态度),但我认为问题隐藏在机载实现本身,在这里,更准确地说:https://github.com/brooklynDev/airborne/blob/master/lib/airborne/path_matcher.rb#L82

此行旨在为与通配符段匹配的每个项目运行期望块(在此特定情况下为此块),但对于空数组,它什么也不做。没有期望运行 - 没有失败。

因此,这不是测试代码中的错误,而是与 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

非常感谢@konstantin-斯特鲁科夫。此解决方案适用于此测试用例。

但是在某些测试用例中,我仍然需要编写一些额外的代码。

您为此 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.?。我试图将您的解决方案适合这些测试用例,但它没有按预期工作。

最新更新