Тестирование массива Ruby Airbone не работает должным образом - PullRequest
0 голосов
/ 08 марта 2019

У меня есть JSON ниже

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

и тест ниже, который может проверить, все ли json itens в массиве itens имеет свойство ID:

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

Проблема в том, что этот тест работает нормально. Но должен потерпеть неудачу.

Мой тест проваливается, только когда я изменяю свои ожидания на:

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

Почему этот тест успешен, а не провален при использовании itens.*

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Я воспроизвел вашу проблему и попытался немного отладить.

Я впервые вижу этот находящийся в воздухе драгоценный камень (поэтому возьмите следующее с небольшим количеством соли), но я думаю, что проблема скрывается в воздухеСама реализация, здесь, чтобы быть более точной: https://github.com/brooklynDev/airborne/blob/master/lib/airborne/path_matcher.rb#L82

Эта строка предназначена для запуска блока ожидания ( этот в данном конкретном случае) для каждого элемента, соответствующего подстановочному сегменту, нодля пустого массива это просто ничего не делает.Нет ожиданий - нет ошибок.

Так что в вашем тестовом коде нет ничего плохого, речь идет о самом геме.В качестве своего рода обходного пути, вы можете попробовать что-нибудь.например:

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

0 голосов
/ 08 марта 2019

Большое спасибо @ 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.?. Я пытался приспособить ваше решение к этим тестам, но оно не сработало, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...