Skip to content

Commit

Permalink
Merge pull request #500 from bia-technologies/feature/432
Browse files Browse the repository at this point in the history
432 / Обновленная документация по мокито
  • Loading branch information
alkoleft authored Jan 31, 2025
2 parents bb2f5d6 + b46b0e0 commit b73711c
Show file tree
Hide file tree
Showing 21 changed files with 4,538 additions and 1,501 deletions.
2 changes: 1 addition & 1 deletion documentation/docs/features/context.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ sidebar_position: 5
1. Передача данных между тестами. Если вам нужно использовать определенные данные в нескольких тестах, вы можете передать их с помощью контекстов.
2. Работа с [текучими выражениями](/docs/getting-started/fluent-api.md). Контексты обеспечивают поддержку текучих выражений, что упрощает написание и чтение кода тестов.
3. [Удаление](test-data/test-data-deletion.md) тестовых данных. После выполнения тестов вы можете использовать контексты для очистки тестовых данных, которые больше не нужны.
4. Передача настроек [Мокито](mocking/mockito.md). Это позволяет настроить поведение мокируемого метода прямо из теста, что упрощает процесс тестирования.
4. Передача настроек [Мокито](mocking/mockito/mockito.md). Это позволяет настроить поведение мокируемого метода прямо из теста, что упрощает процесс тестирования.

Однако стоит отметить, что механизм контекстов имеет некоторые ограничения.

Expand Down
2 changes: 1 addition & 1 deletion documentation/docs/features/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ YAxUnit предоставляет относительно богатый на
При тестировании полезно минимизировать "внешнее" воздействие на проверяемый функционал. Например, не использовать внешний http сервис, а эмулировать взаимодействие с ним, либо вместо выполнения запроса к базе данных вернуть предопределенный результат или вместо документа в качестве параметра передать структуру.
Те заменить какой-либо объект обманкой, упрощенной его версией.

* [`Мокито`](mocking/mockito.md) позволяет настроить/изменить поведение нужных методов конфигурации
* [`Мокито`](mocking/mockito/mockito.md) позволяет настроить/изменить поведение нужных методов конфигурации
* [`Вернуть`](/api/МокитоОбучение#вернуть) нужный результат для определенных параметров.
* [`ВыброситьИсключение`](/api/МокитоОбучение#выброситьисключение) при в нужный момент.
* [`Пропустить`](/api/МокитоОбучение#пропустить) метод (не выполнять).
Expand Down
242 changes: 93 additions & 149 deletions documentation/docs/features/mocking/mocking.md

Large diffs are not rendered by default.

713 changes: 0 additions & 713 deletions documentation/docs/features/mocking/mockito.md

This file was deleted.

395 changes: 395 additions & 0 deletions documentation/docs/features/mocking/mockito/how-to.md

Large diffs are not rendered by default.

520 changes: 520 additions & 0 deletions documentation/docs/features/mocking/mockito/mockito.md

Large diffs are not rendered by default.

327 changes: 327 additions & 0 deletions documentation/docs/features/mocking/mockito/Примеры.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,327 @@
---
tags: [Мокирование]
toc_max_heading_level: 2
---

# Примеры

Мокито — это мощный инструмент для мокирования методов в 1С, который позволяет управлять поведением системы во время тестирования. В этой статье мы рассмотрим все основные возможности Мокито с примерами и пояснениями.

Больше примеров в тестах [тут](https://github.com/bia-technologies/yaxunit/blob/develop/tests/src/CommonModules/ОМ_Мокито/Module.bsl), [тут](https://github.com/bia-technologies/yaxunit/blob/develop/tests/src/CommonModules/ОМ_МокитоОбучение/Module.bsl) и [тут](https://github.com/bia-technologies/yaxunit/blob/develop/tests/src/CommonModules/ОМ_МокитоСлужебный/Module.bsl). Причем всегда актуальных.

---

## Подмена метода общего модуля, должен вернуть нужный результат

### Пример

```bsl
// Настройка мокирования
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос").Вернуть(Новый HTTPСервисОтвет(200))
.Прогон();
// Тестовый прогон
Результат = ОбщийМодуль.РаботаСHTTP.ОтправитьЗапрос("https://example.com");
// Проверка
ЮТест.ОжидаетЧто(Результат.КодСостояния).Равно(200);
```

### Пояснение:
Метод `ОтправитьЗапрос` общего модуля `РаботаСHTTP` возвращает заранее заданный ответ (HTTP-код 200).

---

## Выброс исключения метода документа

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Документы.ПриходТовара)
.Когда("ОбработкаПроведения").ВыброситьИсключение("Ошибка проведения")
.Прогон();
// Тестовый прогон
Документ = Документы.ПриходТовара.СоздатьДокумент();
ЮТест.ОжидаетЧто(() -> Документ.Записать(РежимЗаписиДокумента.Проведение))
.ВыбрасываетИсключение("Ошибка проведения");
```

### Пояснение:
Метод `ОбработкаПроведения` документа `ПриходТовара` выбрасывает исключение при вызове.

---

## Пропуск метода справочника

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Справочники.Номенклатура)
.Когда("ОбновитьЦену").Пропустить()
.Прогон();
// Тестовый прогон
Справочники.Номенклатура.ОбновитьЦену("Товар1", 100);
// Проверка
ЮТест.ОжидаетЧто(Справочники.Номенклатура.ПолучитьЦену("Товар1")).Равно(0);
```

### Пояснение:
Метод `ОбновитьЦену` справочника `Номенклатура` пропускается, и его выполнение не влияет на данные.

---

## Обучение по ссылке на объект

### Пример:
```bsl
// Настройка мокирования
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Товар1");
Мокито.Обучение(Ссылка)
.Когда("ПолучитьЦену").Вернуть(100)
.Прогон();
// Тестовый прогон
Цена = Ссылка.ПолучитьОбъект().ПолучитьЦену();
// Проверка
ЮТест.ОжидаетЧто(Цена).Равно(100);
```

### Пояснение:
Метод `ПолучитьЦену` мокируется для объекта, указанного по ссылке.

---

## Подмена результата метода менеджера

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Документы.ПриходТовара)
.Когда("ПолучитьКоличествоТоваров").Вернуть(10)
.Прогон();
// Тестовый прогон
Количество = Документы.ПриходТовара.ПолучитьКоличествоТоваров();
// Проверка
ЮТест.ОжидаетЧто(Количество).Равно(10);
```

### Пояснение:
Метод `ПолучитьКоличествоТоваров` модуля менеджера документа `ПриходТовара` возвращает заранее заданное значение.

---

## Подмена результата метода отчета

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Отчеты.ОСВ)
.Когда("СформироватьОтчет").Вернуть(Новый ТабличныйДокумент)
.Прогон();
// Тестовый прогон
Отчет = Отчеты.ОСВ.СоздатьОтчет();
Результат = Отчет.СформироватьОтчет();
// Проверка
ЮТест.ОжидаетЧто(Результат).ИмеетТип("ТабличныйДокумент");
```

### Пояснение:
Метод `СформироватьОтчет` отчета `ОСВ` возвращает пустой табличный документ.

---

## Подмена результата метода обработки

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Обработки.УправлениеЗаказами)
.Когда("ОбработатьЗаказ").Вернуть(Истина)
.Прогон();
// Тестовый прогон
Результат = Обработки.УправлениеЗаказами.ОбработатьЗаказ(123);
// Проверка
ЮТест.ОжидаетЧто(Результат).Равно(Истина);
```

### Пояснение:
Метод `ОбработатьЗаказ` обработки `УправлениеЗаказами` возвращает заранее заданное значение.

---

## Разные варианты условий на параметры

### Условие по конкретным значениям

```bsl
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос", Мокито.МассивПараметров("https://example.com", Новый Структура("id", 123)))
.Вернуть(Новый HTTPСервисОтвет(200))
.Прогон();
```

### Условия с использованием `ЛюбойПараметр`, `ЧисловойПараметр`

```bsl
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос", Мокито.МассивПараметров(Мокито.ЛюбойПараметр(), Мокито.ЧисловойПараметр()))
.Вернуть(Новый HTTPСервисОтвет(200))
.Прогон();
```

### Условия, когда указаны не все параметры метода

```bsl
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос", Мокито.МассивПараметров("https://example.com"))
.Вернуть(Новый HTTPСервисОтвет(200))
.Прогон();
```

### Условия с использованием предикатов

```bsl
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос", Мокито.МассивПараметров(Мокито.ЛюбойПараметр(), ЮТест.Предикат().ИмеетСвойство("id")))
.Вернуть(Новый HTTPСервисОтвет(200))
.Прогон();
```

### Несколько условий в одном кейсе

```bsl
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос").ВыброситьИсключение("Ошибка сети")
.Когда("ОтправитьЗапрос", Мокито.МассивПараметров("https://example.com", Новый Структура("id", 123)))
.Вернуть(Новый HTTPСервисОтвет(200))
.Прогон();
```

### Цепочка вызовов

```bsl
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Когда("ОтправитьЗапрос")
.Вернуть(Новый HTTPСервисОтвет(200))
.Вернуть(Новый HTTPСервисОтвет(404))
.Вернуть(Новый HTTPСервисОтвет(500))
.Прогон();
```

---

## Пример мокирования нескольких методов объекта

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Документы.ПриходТовара)
.Когда("ОбработкаПроведения").Пропустить()
.Когда("ПолучитьКоличествоТоваров").Вернуть(10)
.Прогон();
// Тестовый прогон
Документ = Документы.ПриходТовара.СоздатьДокумент();
Количество = Документ.ПолучитьКоличествоТоваров();
Документ.Записать(РежимЗаписиДокумента.Проведение);
// Проверка
ЮТест.ОжидаетЧто(Количество).Равно(10);
ЮТест.ОжидаетЧто(Документ.Проведен).Равно(Ложь);
```

### Пояснение:
Методы `ОбработкаПроведения` и `ПолучитьКоличествоТоваров` мокируются для документа `ПриходТовара`.

---

## Пример мокирования методов нескольких объектов

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(Документы.ПриходТовара)
.Когда("ОбработкаПроведения").Пропустить()
.Прогон();
Мокито.Обучение(Справочники.Номенклатура)
.Когда("ПолучитьЦену").Вернуть(100)
.Прогон();
// Тестовый прогон
Документ = Документы.ПриходТовара.СоздатьДокумент();
Цена = Справочники.Номенклатура.ПолучитьЦену("Товар1");
Документ.Записать(РежимЗаписиДокумента.Проведение);
// Проверка
ЮТест.ОжидаетЧто(Цена).Равно(100);
ЮТест.ОжидаетЧто(Документ.Проведен).Равно(Ложь);
```

### Пояснение:
Методы `ОбработкаПроведения` документа `ПриходТовара` и `ПолучитьЦену` справочника `Номенклатура` мокируются одновременно.

---

## Наблюдение

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Наблюдать("ОтправитьЗапрос")
.Прогон();
// Тестовый прогон
ОбщийМодуль.РаботаСHTTP.ОтправитьЗапрос("https://example.com");
// Проверка
Мокито.Проверить(ОбщийМодуль.РаботаСHTTP)
.КоличествоВызовов("ОтправитьЗапрос")
.Равно(1);
```

### Пояснение:
Метод `ОтправитьЗапрос` наблюдается, и собирается статистика по его вызовам.

---

## Анализ статистики вызовов

### Пример:
```bsl
// Настройка мокирования
Мокито.Обучение(ОбщийМодуль.РаботаСHTTP)
.Наблюдать("ОтправитьЗапрос")
.Прогон();
// Тестовый прогон
ОбщийМодуль.РаботаСHTTP.ОтправитьЗапрос("https://example.com", Новый Структура("id", 123));
ОбщийМодуль.РаботаСHTTP.ОтправитьЗапрос("https://example.com", Новый Структура("id", 456));
// Проверка
Вызовы = Мокито.Проверить(ОбщийМодуль.РаботаСHTTP).Вызовы("ОтправитьЗапрос");
ЮТест.ОжидаетЧто(Вызовы.Количество()).Равно(2);
ЮТест.ОжидаетЧто(Вызовы[0].Параметры[1].id).Равно(123);
ЮТест.ОжидаетЧто(Вызовы[1].Параметры[1].id).Равно(456);
```

### Пояснение:
Статистика по вызовам метода `ОтправитьЗапрос` анализируется, чтобы убедиться, что метод вызывался с правильными параметрами.

---

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

Мокито предоставляет широкие возможности для управления поведением методов в 1С. Благодаря ему можно легко подменять результаты, отключать выполнение, собирать статистику и тестировать сложные сценарии. Используя примеры из этой статьи, вы сможете эффективно применять Мокито в своих тестах.
4 changes: 4 additions & 0 deletions documentation/docs/features/mocking/stubs/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Эмуляторы",
"collapsed": false
}
Loading

0 comments on commit b73711c

Please sign in to comment.