Проверка каратэ, если xml запрос содержит указанное c значение - PullRequest
1 голос
/ 14 января 2020

Мой фиктивный сервер каратэ будет принимать запрос в форме XML, ниже приведен пример запроса:

<methodCall>
<methodName>MyMethod</methodName>
<params>
    <param>
        <value>
            <struct>
                <member>
                    <name>a</name>
                    <value>abc</value>
                </member>
                <member>
                    <name>b</name>
                    <value><i4>2</i4></value>
                </member>
            </struct>
        </value>
    </param>
</params>

В пределах <struct> он может иметь несколько <member> тег. Как я могу проверить, если в запросе <member> есть специфика c <name>, представленная с указанием c <value>?

Я могу определить Scenario, как показано ниже:

Scenario: pathMatches('/test') && methodIs('post') && bodyPath('/methodCall/methodName') == 'MyMethod'

для обработки запроса на основе methodName, но я бы хотел сделать другую обработку в зависимости от того, что <member> содержит. Например: если запрос содержит элемент с <name>color</name> со значением <value>blue</value>, тогда я сделаю эту работу соответственно.

1 Ответ

2 голосов
/ 14 января 2020

Может быть, вы слишком обдумываете это, и того, что у вас есть, может быть достаточно. Все, что вам нужно сделать, это вернуть response условно. Одним из советов является то, что каратэ может автоматически конвертировать XML в JSON, что удобно, потому что легче писать JSON -путь или операции фильтрации:

Вот пример кода, который может дать вам некоторые идеи:

* def structs = get[0] request..member
* def fun = function(x){ return x.name == 'a' && x.value == 'abc' }
* def test = karate.filter(structs, fun)
* if (test.length) karate.set('response', '<some>response</some>')

Полагаю, смысл в том, что вы пытаетесь выполнить нетривиальную условную обработку, поэтому код будет более сложным, чем обычно.

Вы можете использовать JSON -path вместо хака karate.filter(), но выражение запроса может усложнить чтение IMO. Обратите внимание, что вы можете определить такую ​​функцию, как getStructType() в Background - поместить все логики c, которые вы хотите, - и затем использовать ее в Scenario HTTP-пути «маршрут» выражения.

...