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