Как проверить дополнительные значения с условием if (используя фреймворк карате)?

Я хотел бы проверить ответ на запрос GET / birds с помощью схемы json. В моей особенности:

* def abs = read (birds.json)
* match response == abs.birdsSchema

Мне нужно поместить схему в файл json, а не в функцию. Мне нужно проверить дополнительные значения в зависимости от пола. Пример: если пол мужской, проверьте, синий ли цвет, а хвост длинный или короткий. если пол женский, проверьте, истинно ли "поет" или нет, а также количество яиц.

Поэтому я вставил birds.json:

"birdsSchema":{
    "id": "#string",
    "owner": "#number",
    "town": "#? _ == 'New York' || _ == 'Washington'",
    "type": "object",
    "oneOf": [
        {
            "properties": {
                "gender": {"enum": ["male"]},
                "color":"blue",
                "tail": "#? _ == 'long' || _ == 'short'"
            }
        },
        {
            "properties": {
                "gender": {"enum": ["female"]},
                "sings" : "#? _ == true || _ == false"
                "eggs": "##number"
            }
        }
    ]
}

Но это не работает. Ошибка: com.intuit.karate.exception.KarateException: путь: $ [0] .type, фактический: «женский», ожидаемый: «объект», причина: не равно. Как я могу выполнить эту условную проверку в моем файле json?


person cygne    schedule 10.10.2017    source источник


Ответы (1)


Давайте признаем, что это очень сложно, потому что, если я правильно понимаю ваш вопрос, ключи JSON, которые вы ищете, являются динамическими.

Часть удовольствия от каратэ заключается в том, что я могу придумать как минимум 5 различных способов элегантного решения этой проблемы. Вот только один:

* def response = { color: 'black', aaa: 'foo' }

* def schema = { color: '#? _ == "black" || _ == "white"' }
* def extra = (response.color == 'black' ? { aaa: '#string' } : { fff: '#string' })

* match response contains schema
* match response contains extra

Если вы создадите JS-функцию на основе приведенной выше подсказки, вы, вероятно, сможете получить лучшее решение. Имейте в виду, что в функции JS вы можете использовать такие методы, как karate.set, для динамического создания ключей. Так что возможностей много :)

edit: похоже, что приведенный выше пример неверен, а ключи не динамические. Тогда это легко, имейте в виду, что $ относится к корню JSON:

* def response = { color: 'black', extra: 'foo' }    
* def schema = { color: '#? _ == "black" || _ == "white"', extra: '#($.color == "black" ? "foo" : "bar")' }    
* match response == schema
person Peter Thomas    schedule 10.10.2017
comment
спасибо за ваш быстрый ответ. Я знаю, как это сделать в функциях, благодаря официальному туториалу Karate, но я хотел сделать это в файле json. Идея состоит в том, что будет только один файл json со схемой для колес, и разные функции будут использовать его при проверке ответов. Как я могу сделать то же самое в файле json? - person cygne; 10.10.2017
comment
Ключи JSON не динамические - person cygne; 10.10.2017
comment
пожалуйста, не могли бы вы нам помочь? Я отредактировал вопрос, чтобы было легче понять - person cygne; 27.10.2017
comment
Я думаю, что ваше редактирование затрудняет понимание: P Каково ваше ожидаемое поведение? Каратэ не поддерживает oneOf, если вы этого ожидаете. Другими словами, Karate не поддерживает напрямую схему JSON. Посмотрите на этот пример, если вы хотите использовать схему JSON через библиотеку Java: github.com/intuit/karate/blob/master/karate-demo/src/test/java/ - person Peter Thomas; 27.10.2017