Оценить выражение, которое возвращает логическое значение в Wiremock - Запросить критерии соответствия - PullRequest
0 голосов
/ 26 октября 2018

Попытка использовать Wiremock в качестве инструмента для виртуализации сервисов SOAP.

Критерии сопоставления запросов выглядят примерно так: -

Критерии сопоставления:

   {
      "request":{
        "method":"POST",
        "urlPattern":"/myServices/mycontent.asgx",
        "headers":{
          "SOAPAction":{
            "contains":"#SearchMyContent"
          }
        },
        "bodyPatterns":[{
          **"matchesXPath":"//data:MyContentItemCode[contains(text(), 'SD_12345')] and //MyContentItemCode[contains(text(), 'SD_22222')]",**
          "xPathNamespaces":{
            "SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
            "data":"http://www.ins.com/insi/1.0/insi-data",
            "msg":"http://www.ins.com/insi/1.0/insi-messaging",
            "nc":"http://www.ins.com/insi/1.0/insi-non-compliant",
            "soapenv":"http://schemas.xmlsoap.org/soap/envelope/",
            "srvc":"http://www.ins.com/insi/1.0/insi-services"
        }
        }]
      },
      "response":{
        "status":200,
        "headers":{
          "Content-Type":"text/xml;charset=utf-8"
        },
        "body":"encoded_XML_body"
      }
    } 

По соображениям безопасности я не могу опубликовать весь SOAPздесь запрос на обслуживание, но ниже приведен небольшой фрагмент из службы SOAP, который должен соответствовать xpath в критериях сопоставления

<srvc:MyContentItemCodeList>
    <data:MyContentItemCode>SD_12345</data:MyContentItemCode>
    <data:MyContentItemCode>SD_22222</data:MyContentItemCode>
</srvc:MyContentItemCodeList>

Как видите, я пытаюсь сопоставить оба " data: MyContentItemCode"теги в моих критериях сопоставления.Однако, Wiremock не распознает / не поддерживает это.Это может быть потому, что xpath возвращает логическое значение.Мои вопросы: есть ли способ сопоставления логических значений в Wiremock.

Я не нашел здесь примера в документации Wiremock: - http://wiremock.org/docs/request-matching/

Когда я публикую сопоставления всервер Wiremock, он успешно публикуется, но когда я пытаюсь попасть на сервер Wiremock, я не получаю обратно свой виртуализированный ответ (т. е. сопоставление запроса не учитывается)

Любая помощь / указатели на это будут оценены.

1 Ответ

0 голосов
/ 28 октября 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что вам нужно вернуть элемент / тег в средство сопоставления.Это можно сделать с помощью корневого тега.В этом примере я использовал тег мыльного конверта, который намекнул ваш пример на существующий.

Механизм возврата только корневого элемента заключается в подсчете количества элементов, соответствующих вашим критериям.Если оба имеют значение true, то корневой элемент также возвращается.В приведенном ниже примере именно это и делается.

mapping.json

   {
      "request":{
        "method":"POST",
        "urlPattern":"/dtag",
        "bodyPatterns":[{
          "matchesXPath":"/SOAP-ENV:Envelope[count(//data:MyContentItemCode[contains(text(), 'SD_12345')])=1 and count(//data:MyContentItemCode[contains(text(), 'SD_22222')] )=1]",
          "xPathNamespaces":{
            "SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
            "data":"http://www.ins.com/insi/1.0/insi-data",
            "srvc":"http://www.ins.com/insi/1.0/insi-services"
        }       

        }]
      },
      "response":{
        "status":200,
        "headers":{
          "Content-Type":"text/xml;charset=utf-8"
        },
        "body":"encoded_XML_body"
      }
    } 

Приведенный ниже XML отправляется через запрос POST на указанный ниже URL-адрес.Поскольку WireMock весьма требователен к пространствам имен, убедитесь, что у вас есть правильные пространства имен, связанные с тегами, которые появляются в вашем запросе.

Запрос на http://localhost/dtag

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:data="http://www.ins.com/insi/1.0/insi-data"
xmlns:srvc="http://www.ins.com/insi/1.0/insi-services">
    <srvc:MyContentItemCodeList >
    <data:MyContentItemCode>SD_12345</data:MyContentItemCode>
    <data:MyContentItemCode>SD_22222</data:MyContentItemCode>
    </srvc:MyContentItemCodeList>
</soap:Envelope>
...