<mockService>
Описание
Тег <mockService>
позволяет задать заглушки ответов на запросы к методам интеграций с внешними сервисами.
Тег выполняет ту же задачу, что тег <mockData>
для HTTP-запросов. Он задает фиктивные ответы,
которые будут применяться при выполнении автоматических тестов сценариев, где используется сервис $integration
.
-
Когда при выполнении тестов в сценарии вызывается один из методов
$integration
, система проверяет, предусмотрен ли в тесте соответствующий тег<mockService>
с такими же параметрами, что переданы как аргументы при вызове метода. -
Если такой тег существует и его параметры совпадают с ожидаемыми, то система использует ответ, указанный в
<mockService>
, в качестве ответа от внешнего сервиса. Таким образом, реальные запросы при выполнении автоматических тестов не выполняются.
$integration
, но в тесте для него нет соответствующего тега <mockService>
с совпадающими параметрами,
то возвращаемое значение метода будет null
.Структура
Элемент с тегом <mockService>
должен быть вложен в элемент <test>
и иметь атрибут id="integration"
.
Элемент может иметь следующие дочерние элементы:
-
<service>
— тип интеграции. В настоящий момент поддерживается только типgoogleSheets
. -
<method>
— проверяемый метод. Возможные значения:readDataFromCells
writeDataToCells
writeDataToLine
deleteRowOrColumn
clearCellData
customRequest
-
<parameters>
— список аргументов, передач а которых ожидается при вызове метода. Содержит вложенные элементы, теги которых соответствуют названиям аргументов.
Например, метод readDataFromCells
принимает аргументы integrationId
, spreadsheetId
, sheetName
и cells
,
поэтому элемент <parameters>
может быть заполнен так:
<parameters>
<integrationId>4404df16-bfc7-4bc6-9f84-65d02d000217</integrationId>
<spreadsheetId>1gdkEwg2KMeKYJK-yrxgKuk9-uP7ntjtKg5ChDu8906E</spreadsheetId>
<sheetName>Sheet1</sheetName>
<cells>["B4", "D4"]</cells>
</parameters>
<response>
— ответ в формате JSON, который будет принят за ответ от метода при выполнении теста.
Пример
Рассмотрим следующий фрагмент сценария.
Бот принимает время и произвольный текст, которые он записывает в новую строку таблицы через метод writeDataToLine
.
patterns:
# Обертка встроенного паттерна $nonEmptyGarbage в именованный паттерн $text.
# Благодаря такому переопределению из $parseTree возможно извлечь текст, попавший в паттерн.
$text = $nonEmptyGarbage || converter = function($parseTree) { return $parseTree.text; }
theme: /
state: AddNote
# Для распознавания времени используется системная сущность @duckling.time.
# Чтобы было удобнее обращаться к извлеченному значению, сущности приписан псевдоним time.
q!: * запиши @duckling.time::time $text *
script:
$temp.res = $integration.googleSheets.writeDataToLine(
"a410105c-83a1-45ce-abcf-29c72358c409",
"1gdkEwg2KMeKYJK-yrxgKuk9-uP7ntjtKg5ChDu8906E",
"Sheet1",
[$parseTree._time.value, $parseTree._text]
);
if: $context.response.googleSheets.result === "success"
# Метод возвращает в поле updatedRanges массив строк вида Sheet1!A1:B2.
a: Записала «{{$parseTree._text}}» в ячейки {{$temp.res.updatedRanges[0].split("!")[1]}}.
else:
a: Извините, я не смогла записать данные в таблицу.
Работу такого стейта можно проверить при помощи теста, приведенного ниже.
<test>
<mockService id="integration">
<service>googleSheets</service>
<method>writeDataToLine</method>
<parameters>
<integrationId>a410105c-83a1-45ce-abcf-29c72358c409</integrationId>
<spreadsheetId>1gdkEwg2KMeKYJK-yrxgKuk9-uP7ntjtKg5ChDu8906E</spreadsheetId>
<sheetName>Sheet1</sheetName>
<values>["2021-11-26T00:00:00", "сделать уборку"]</values>
</parameters>
<response>
{"updatedRanges": ["Sheet1!A1:B1"]}
</response>
</mockService>
<test-case>
<dateTime>2021-11-25 12:00:00</dateTime>
<q>запиши завтра сделать уборку</q>
<a>Записала «сделать уборку» в ячейки A1:B1.</a>
</test-case>
</test>
-
Поскольку в примере используется сущность
@duckling.time
, для тест-кейса необходимо переопределить текущее время через тег<dateTime>
. -
В значении
<response>
указаны не все поля, которые возвращает интеграция: достаточно перечислить лишь те поля, которые используются в коде сценария.