Ruby Airbone阵列测试无法按预期进行

时间:2019-03-07 21:29:42

标签: ruby testing airborne

我下面有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.*时此测试成功而不是失败

2 个答案:

答案 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.?来工作。我已尝试将您的解决方案适合这些测试用例,但未按预期工作。