Перейти к основному содержимому

<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> указаны не все поля, которые возвращает интеграция: достаточно перечислить лишь те поля, которые используются в коде сценария.