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

Ruby Airbone array testing is not working as expected

下面有json

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

和下面的测试可能会检查数组 itens 中的所有 json 元素是否具有 ID 属性:

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

问题是这个测试运行正常。但是应该会失败。

我的测试只有在我改变我的期望时才会失败:

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

为什么这个测试在使用 itens.*

时会成功而不是失败

我重现了你的问题并尝试调试了一下。

我第一次看到这个机载 gem(所以对下面的内容持保留态度),但我认为问题隐藏在机载实现本身,在这里,更准确地说: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

非常感谢@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.?。我尝试在这些测试用例中使用您的解决方案,但它没有按预期工作。