Framework API каратэ есть ли способ перебора дочерних значений - PullRequest
0 голосов
/ 07 ноября 2019

Я получаю 90-центовый успех с моим подходом, но когда в ответе есть несколько записей в одном из дочерних ключей, логика перестает работать, и я не могу установить одну общую логику, которая будет работать для всех случаев. ,

Пример ответа:

{
  "items": [
             {
              "id":1,
              "name": "John",
              "sections": [
                          { 
                           "id":1,
                           "description": "John smith" 
                          }
                      ]
           }
         ]
}

Теперь мой сценарий использования говорит, что вы ищете текст Джона, и тогда массив items будет содержать много объектов, чьи items.name или items.sections.description должны содержатьКлючевое слово "Джон"

Логика сопоставления, которую я поставил, работает нормально, потому что я перебираю элементы []. Name и items.sections []. Description

Основная проблема возникает, когда разделы [*]. Description содержат несколько разделов, как показано ниже

{
  "items": [
             {
              "id":1,
              "name": "John",
              "sections": [
                          { 
                           "id":1,
                           "description": "John smith" 
                          },
                          { 
                           "id":1,
                           "description": "remain smith of the first object" 
                          }
                      ]
           }
         ]
}

Логика должна теперь работать с элементами []. Name или items.sections [].description (несколько записей разделов [*]. description)

Проблема, с которой я сталкиваюсь, заключается в том, что я перебираю элементы []. name & items []. section [*]. description

Это дает мне все имена и все разделы. Описание в отдельных массивах. Я хочу, чтобы он выдавал меня один за другим.

Например, первый набор результатов должен дать мне ниже

[
"John"
]

and 

[
"John smith"
"remain smith of the first object" 
]

Так что я могу руВ моей существующей логике, чтобы проверить, доступен Джон или нет. В настоящее время моя логика работает с первой записью описания и не проверяет следующую запись или section.description, что является причиной сбоя при сопоставлении объекта, поскольку во второй записи описания присутствует «john»

{
  "items": [
             {
              "id":11,
              "name": "SMITH",
              "sections": [
                          { 
                           "id":11,
                           "description": "SMITH" 
                          },
                          { 
                           "id":11,
                           "description": "JOHN Carter" 
                          }
                      ]
           }
         ]
}

Логика сопоставления, которую я сейчас использую: -

* def matchText = 
"""
function (nameArr, sectionArr, matchingWord)
{
for(var i = 0; i < nameArr.length; i++)
var regEx = new RegExp(matchingWord, 'gi')
var nameMatch = nameArr[i].match(regEx)
var secMatch = sectionArr[i].match(regEx)
if (nameMatch ==null && secMatch == null) {
return false;
}
}
return true;
}
"""
* def getName = get response.items[*].name
* def getDescription = get response.items[*].sections[*].description
* assert matchText(getName,getDescription,'john')

Так что эта логика работает, когда у вас одинаковая длина в name & section.description, но когда section.description имеет несколько массивов, тогда нетповторить правильно. Это была единственная причина, по которой я хотел трактовать имя как один объект, а section.description - как другой, даже если в нем будет несколько дочерних идентификаторов.

1 Ответ

1 голос
/ 07 ноября 2019

Код образца:

Feature: Validation

    Scenario:
        * def resp =
            """
            {
                "items": [
                    {
                        "id": 11,
                        "name": "JOHN",
                        "sections": [
                            {
                                "id": 11,
                                "description": "SMITH"
                            },
                            {
                                "id": 11,
                                "description": "JOHN Carter"
                            }
                        ]
                    }
                ]
            }
            """
    * def names = []
    * def fun =
        """
        function(x){ 
            var json  = x.sections; 
            var temp = x.name
            for(var i = 0; i < json.length; i++) {
                var obj = json[i];
                temp = temp + "," + obj.description
            }                
             karate.appendTo(names, temp);
            }
        """
    * def items = get resp.items[*]
    * karate.forEach(items, fun)
    * match each names == '#regex .*JOHN.*'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...