Skip to content

Commit

Permalink
doc: продолжаем дробить
Browse files Browse the repository at this point in the history
  • Loading branch information
alkoleft committed Dec 13, 2024
1 parent 67dfe68 commit 2410637
Show file tree
Hide file tree
Showing 7 changed files with 355 additions and 99 deletions.
101 changes: 6 additions & 95 deletions documentation/docs/features/mocking/mocking.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,105 +84,16 @@ sequenceDiagram

Подробнее о возможностях и принципах работы с Мокито, вы можете почитать в отдельной [статье](mockito.md).

## Моки
## Заглушки (stubs)

Мокито помогает изменять логику работы системы для изоляции тестируемого метода и уменьшения влияния других компонентов системы.
Он закрывает множество задач, но иногда возникают задачи когда даже он не может помочь.

### `HTTPСервисЗапрос`

Первый пример с которым мы столкнулись - тестирование http-сервисов. Сервис на вход принимает объект `HTTPСервисЗапрос`, который невозможно создать и настроить из кода 1С.
Необходимо было либо публиковать решение на web-сервере, либо дорабатывать код, чтобы он принимал структуры.

Несколько первых тестов были созданы с помощью структур. Позже возникла идея реализовать мок, который бы походил на `HTTPСервисЗапрос`, реализовывал его интерфейс, и который можно настроить из теста.
С ним тестировать сервисы стало намного проще и удобнее, позже его включили в YAxUnit, [`ЮТест.Данные().HTTPСервисЗапрос`](/api/ЮТТестовыеДанные#httpсервисзапрос)

Возможности:

* Реализует методы `HTTPСервисЗапрос`
* Свойства
* `HTTPМетод` \ `HTTPMethod`
* `БазовыйURL` \ `BaseURL`
* `Заголовки` \ `Headers`
* `ОтносительныйURL` \ `RelativeURL`
* `ПараметрыURL` \ `URLParameters`
* `ПараметрыЗапроса` \ `QueryOptions`
* Методы
* `ПолучитьТелоКакДвоичныеДанные()` \ `GetBodyAsBinaryData()`
* `ПолучитьТелоКакПоток()` \ `GetBodyAsStream()`
* `ПолучитьТелоКакСтроку()` \ `GetBodyAsString()`
* Имеет методы настройки, реализованные в виде [текучих выражений](/docs/getting-started/fluent-api.md)
* Установка тела
* `УстановитьТелоКакДвоичныеДанные()`
* `УстановитьТелоКакСтроку()`
* `УстановитьТелоКакСтрокуJSON()`
* Методы установки свойств
* `ДобавитьЗаголовок()`
* `ДобавитьПараметрЗапроса()`
* `ДобавитьПараметрURL()`
* `Метод()`
* `БазовыйURL()`
* `ОтносительныйURL()`

### `ADO.RecordSet`

При тестировании прямых запросов к СУБД также возникает потребность использовать мок, для эмуляции чтения из `ADO.RecordSet`.

Для таких кейсов был добавлен [`ЮТест.Данные().ADORecordSet`](/api/ЮТТестовыеДанные#adorecordset) реализующий интерфейс `ADO.RecordSet`

* Свойства
* `EOF`
* `BOF`
* `AbsolutePosition`
* `RecordCount`
* `Fields`
* Методы
* `MoveFirst()`
* `MoveNext()`
* `Close()`
* `Fields()`
* `EOF()`
* `BOF()`
* Методы настройки, реализованные в виде [текучих выражений](/docs/getting-started/fluent-api.md)
* `ЮТест.Данные().ADORecordSet` - принимает информацию о колонках
* `Добавить()` - добавляет новую строку значений

### `СообщениеСервисаИнтеграции`

При тестировании интеграций с помощью 1С:Шина есть потребность тестировать сбор/разбор сообщений сервисов интеграции.

У `СообщениеСервисаИнтеграции` отсутствует конструктор, поэтому был добавлен [`ЮТест.Данные().СообщениеСервисаИнтеграции`](/api/ЮТТестовыеДанные#IntegrationServiceMessage) реализующий интерфейс `СообщениеСервисаИнтеграции`

Возможности:

* Реализует методы `СообщениеСервисаИнтеграции`
* Свойства
* `ДатаОтправки`
* `ДатаУстаревания`
* `Идентификатор`
* `ИдентификаторСообщенияЗапроса`
* `КодОтправителя`
* `КодПолучателя`
* `Параметры`
* `РазмерТела`
* Методы
* `ПолучитьТелоКакПоток()`
* Имеет методы настройки, реализованные в виде [текучих выражений](/docs/getting-started/fluent-api.md)
* Установка тела
* `УстановитьТелоКакДвоичныеДанные()`
* `УстановитьТелоКакСтроку()`
* `УстановитьТелоКакСтрокуJSON()`
* Методы установки свойств
* `ДобавитьПараметр()`
* `ДатаОтправки()`
* `ДатаУстаревания()`
* `Идентификатор()`
* `ИдентификаторСообщенияЗапроса()`
* `КодОтправителя()`
* `КодПолучателя()`
* `РазмерТела()`

### Создание своих моков
* Заглушка [`HTTPСервисЗапрос`](stubs/http-service-request.md) для тестирования HTTP-сервисов в 1С.
* Заглушка [`СообщениеСервисаИнтеграции`](stubs/integration-service-message.md) для тестирования интеграций с помощью 1С:Шина.
* Заглушка [`ADO.RecordSet`](stubs/ado-recordset.md) для тестирования прямых запросов к СУБД.

### Создание своих заглушек

При возникновении подобных ситуаций, когда для тестов вам нужны объекты с какой-то логикой/методами, по аналогии с примерами выше вы без проблем сможете создать нужные вам моки.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

1. **Методы добавляются в расширение**: В расширении конфигурации создаются специальные обработчики методов, которые заменяют реальные методы.
2. **Обработчики перехватывают вызовы**: Когда метод вызывается, вместо реальной логики выполняется обработчик, который анализирует вызов и применяет настройки мокирования.
3. Подробнее принцип работы мокито описан в отдельной [статье](how-to.md)

### Пример обработчика для функции:

Expand Down
11 changes: 8 additions & 3 deletions documentation/docs/features/mocking/mockito/mockito.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
Вот переработанная версия статьи, сделанная более простой и понятной:

---
tags: [Начало, Мокирование]
sidebar_position: 1
---

# Мокирование в YAxUnit
# Мокито

[Мокито](/api/Мокито) — это модуль, созданный по образцу популярного Java-фреймворка для тестирования [Mockito](https://site.mockito.org/). Он расширяет возможности тестирования, позволяя легко изменять поведение системы, подменяя результаты работы методов, отключая алгоритмы и проверки.

Expand All @@ -28,10 +29,14 @@
- Методов общих модулей
- Методов менеджеров
- Методов объектов (документов, справочников и т.д.)
- Методов отчетов и обработок
- Событий объектов метаданных
- Методов модулей прочих объектов метаданных

**Примеры:**

- Мокирование метода для всех объектов определенного типа:

```bsl
Мокито.Обучение(Документы.ПриходТовара)
.Когда("ОбработкаПроведения")
Expand Down
73 changes: 73 additions & 0 deletions documentation/docs/features/mocking/stubs/ado-recordset.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Тестирование прямых запросов к СУБД

При тестировании прямых запросов к СУБД часто возникает потребность в эмуляции работы с объектом `ADO.RecordSet`. Этот объект используется для чтения данных из результатов SQL-запросов, но его прямое использование в тестах затруднено из-за отсутствия возможности программно создать и настроить его. Для решения этой проблемы была разработана заглушка (stub), которая имитирует интерфейс `ADO.RecordSet` и позволяет упростить тестирование.

Для упрощения тестирования была разработана заглушка `ADO.RecordSet`, которая реализует интерфейс этого объекта и предоставляет методы для настройки данных. Заглушка включена в библиотеку YAxUnit и доступна через метод [`ЮТест.Данные().ADORecordSet`](/api/ЮТТестовыеДанные#adorecordset).

## Возможности заглушки

Заглушка для `ADO.RecordSet` предоставляет следующие возможности:

### Реализация свойств и методов `ADO.RecordSet`

- **Свойства:**
- `EOF` — флаг конца набора данных.
- `BOF` — флаг начала набора данных.
- `AbsolutePosition` — текущая позиция курсора.
- `RecordCount` — количество записей в наборе данных.
- `Fields` — коллекция полей (колонок).

- **Методы:**
- `MoveFirst()` — перемещение курсора на первую запись.
- `MoveNext()` — перемещение курсора на следующую запись.
- `Close()` — закрытие набора данных.
- `Fields()` — получение значения поля по имени.
- `EOF()` — проверка, достигнут ли конец набора данных.
- `BOF()` — проверка, находится ли курсор в начале набора данных.

### Методы настройки

Заглушка также предоставляет методы настройки, реализованные в виде текучих выражений (fluent API), что делает процесс настройки данных более удобным и читаемым.

- **Создание заглушки:**
- `ЮТест.Данные().ADORecordSet()` — принимает информацию о колонках (имена и типы данных).

- **Добавление данных:**
- `Добавить()` — добавляет новую строку значений в набор данных.

## Пример использования заглушки

Пример использования заглушки для тестирования кода, работающего с `ADO.RecordSet`:

```bsl
Процедура ТестADORecordSet()
// Создаем заглушку ADO.RecordSet с двумя колонками: "ID" и "Name"
Заглушка = ЮТест.Данные().ADORecordSet("ID", "Name");
// Добавляем данные в заглушку
Заглушка.Добавить(1, "Item 1")
.Добавить(2, "Item 2")
.Добавить(3, "Item 3");
// Перемещаемся на первую запись
Заглушка.MoveFirst();
// Проверяем значения полей
ЮТест.ОжидаетЧто(Заглушка.Fields("ID")).Равно(1);
ЮТест.ОжидаетЧто(Заглушка.Fields("Name")).Равно("Item 1");
// Перемещаемся на следующую запись
Заглушка.MoveNext();
// Проверяем значения полей
ЮТест.ОжидаетЧто(Заглушка.Fields("ID")).Равно(2);
ЮТест.ОжидаетЧто(Заглушка.Fields("Name")).Равно("Item 2");
// Проверяем количество записей
ЮТест.ОжидаетЧто(Заглушка.RecordCount).Равно(3);
КонецПроцедуры
```

## Заключение

Использование заглушки для `ADO.RecordSet` значительно упрощает процесс тестирования кода, работающего с прямыми запросами к СУБД. Благодаря возможностям, предоставляемым библиотекой YAxUnit, теперь можно легко настраивать данные и эмулировать поведение `ADO.RecordSet`, не прибегая к сложным и громоздким решениям. Это делает процесс разработки и тестирования более гибким и эффективным.
Loading

0 comments on commit 2410637

Please sign in to comment.