<mockData>
Описание
Тег <mockData>
позволяет задать заглушки ответов (мок-объекты) на HTTP-запросы из сценария бота.
Когда при выполнении тестов в сценарии вызывается метод $http.query
или его аналоги (например, $http.get
),
система проверяет, предусмотрен ли в тесте соответствующий тег <mockData>
с такими же параметрами и телом, с какими выполняется HTTP-запрос.
-
Если такой тег существует и указанные в нем URL и тело запроса в точности совпадают с ожидаемым и, то система использует ответ, указанный в
<mockData>
, в качестве тела HTTP-ответа, полученного в результате вызова метода. -
Если в сценарии есть вызов
$http
, для которого в тесте нет подходящего элемента<mockData>
, HTTP-запрос будет принят за неудачный и не вернет данных в ответе. Из-за этого тест, вероятнее всего, будет провален.
Реальные HTTP-запросы при выполнении автоматических тестов не выполняются.
<test>
или <test-case>
атрибут integration="true"
,
чтобы при запуске теста или тест-кейса выполнялись HTTP-запросы. В таком случае <mockData>
можно не указывать.integration="true"
и достаточно часто запускаете автоматические тесты,
то реальные запросы могут быстро исчерпать квоты на использование или иметь другие нежелательные побочные эффекты во внешних системах. Рекомендуется использовать интеграционные тесты только для тех частей сценария, где действительно необходимо проверить работу бота в связке с внешней системой, интегрированной через HTTP API.
Структура
Элемент <mockData>
может иметь следующие дочерние элементы.
URL и параметры запроса
-
<query>
— описание запроса. Обязательный элемент.- Атрибут
method
— HTTP-глагол, используемый при запросе. Значение по умолчанию —GET
. - В теле элемента
<query>
обязательно указывается URL, на который посылается запрос.
- Атрибут
-
<parameters>
— переменные значения для подстановки в URL. Необязательный элемент.
Чтобы задать переменные значения (чаще всего это параметры запроса),
можно подставить их непосредственно в тело элемента <query>
или использовать отдельный элемент <parameters>
.
Дочерние элементы <parameters>
должны иметь вид <имя-параметра>значение-параметра</имя-параметра>
,
а в <query>
на месте параметров должны стоять заглушки вида ${имя-параметра}
.
&
на &
, <
на <
, >
на >
.- Параметры внутри URL
- Параметры отдельно от URL
<mockData>
<query>https://httpbin.org/get?foo=bar&text="Привет, мир!"</query>
<!-- ... -->
</mockData>
<mockData>
<query>https://httpbin.org/${endpoint}?foo=${foo}&text=${text}</query>
<parameters>
<endpoint>get</endpoint>
<foo>bar</foo>
<text>Привет, мир!</text>
</parameters>
<!-- ... -->
</mockData>
Тело запроса
<body>
— описание тела запроса. Необязательный элемент.
Если указан тег <body>
, при выполнении HTTP-запроса мок-объект дополнительно проверяется
на соответствие указанного тела запроса реально переданному из сценария.
В теле элемента <body>
обязательно указывается JSON-объект или примитив, передача которого ожидается в теле запроса.
Для тега можно задать необязательные атрибуты:
-
strictMatch
— строгость сопоставления мок-объекта телу запроса. Значение по умолчанию:false
.- При нестрогом сопоставлении (
false
) проверяется, что все значения полей, указанные в теге<body>
, равны соответствующим значениям полей из тела запроса. - При строгом сопоставлении (зна чение
true
) проверяется полное совпадение объекта в теге<body>
и тела запроса.
- При нестрогом сопоставлении (
-
field
— JsonPath-выражение, указывающее на поле для сопоставления. Если атрибут указан, сопоставление производится не по всему объекту из тела запроса, а только по его части.
<mockData>
<query method="POST">https://httpbin.org/post</query>
<body>
{
"foo": "bar"
}
</body>
<!-- ... -->
</mockData>
Ответ
<response>
— описание ответа, который вернет мок-объект в качестве ответа сервера.
Обязательный элемент. В теле элемента указывается строка с ответом.
$http.query
помимо HTTP-ответа в поле data
содержит ряд служебных полей: isOk
, status
и другие.
Данные поля не следует помещать в <response>
. Указывайте только ответ от сервера — то, что приходит в поле data
.Возможные атрибуты для тега:
status
— код ответа на HTTP-запрос, по умолчанию200
.type
— тип ответа, по умолчаниюjson
.- Если тип ответа
json
илиxml
, ответ парсится и возвращается в сценарий в виде JS-объекта. - В противном случае ответ передается в виде строки.
- Если тип ответа
<response>
не соответствует указанному типу, при публикации бота возникнет синтаксическая ошибка.<mockData>
<query>https://httpbin.org/json</query>
<response>
{
"slideshow": {
"title": "Sample Slide Show"
}
}
</response>
</mockData>
Ответ в виде строки
Если указанный тип ответа не json
или xml
, то ответ передается в сценарий в виде строки с учетом всех пробельных символов.
В следующих двух примерах ответы будут разными:
- Ответ без пробелов
- Ответ с пробелами
<mockData>
<query>https://httpbin.org/get</query>
<response type="text">ok</response>
</mockData>
$http.query("http://httpbin.org/get"); // => {..., data: "ok"}
<mockData>
<query>https://httpbin.org/get</query>
<response type="text">
ok
</response>
</mockData>
$http.query("http://httpbin.org/get"); // => {..., data: "\n ok\n "}
Пустой ответ
Тело элемента <response>
может быть пустым. В таком случае в качестве ответа в сценарий передается пустой объект.
<mockData>
<query>https://httpbin.org/status/204</query>
<response status="204"/>
</mockData>