1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-02-10 19:41:26 +02:00
Описание предикатов
This commit is contained in:
alkoleft 2023-05-25 13:50:33 +03:00
parent 7bbd8d8a67
commit 0a8b50a470
3 changed files with 104 additions and 18 deletions

View File

@ -1,6 +1,7 @@
---
tags: [Getting started, Mock]
---
# Мокито
Мокито - модуль созданный по образу популярного java-фреймворка для тестирования [Mockito](https://site.mockito.org/). Расширяет возможности тестирования, позволяет легко менять логику работы системы подменяя результаты работы методов, отключая какие-либо алгоритмы и проверки.

View File

@ -1,24 +1,55 @@
# Предикаты
Механизм предикатов позволяет:
* Формировать наборы утверждений и передавать в методы проверки
* Методы для формирования предикатов имеют такой же синтаксис как и утверждения для тестов (`ЮТест.ОжидаетЧто()`)
* Проверять элементы коллекций на соответствие утверждениям
Например
Предикаты это утверждения, которые вы можете передавать в качестве параметров.
Они расширяют и унифицируют функциональность тестового движка.
```bsl
ЮТест.ОжидаетЧто(Коллекция)
.ЛюбойЭлементСоответствуетПредикату(Ютест.Предикат()
.Реквизит("Число").Равно(2)); // Проверят, что в коллекции есть элементы с реквизитом `Число`, которое равно `2`
ЮТест.ОжидаетЧто(Коллекция)
.КаждыйЭлементСоответствуетПредикату(Ютест.Предикат()
.Заполнено().ИмеетТип("Массив")); // Проверят, что каждый элемент коллекции это заполненный массив
Процедура АктуализацияУведомлений() Экспорт
ИмяРегистра = "РегистрСведений.ОповещенияПользователя";
Объект = ТестовыеДанные.Объект();
УсловиеУведомления = ЮТест.Предикат()
.Реквизит("Источник").Равно(Объект)
.Реквизит("ТипОповещения").Равно(Справочники.ТипыОповещенийПользователя.Уведомление1)
.Получить();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.НеСодержитЗаписи(УсловиеУведомления);
УведомленияВызовСервера.АктуализацияУведомлений();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.СодержитЗаписи(УсловиеУведомления);
ДанныеУведомления = ЮТЗапросы.Запись(ИмяРегистра, УсловиеУведомления);
ЮТест.ОжидаетЧто(ДанныеУведомления)
.Свойство("Прочитано").ЭтоЛожь()
.Свойство("Пользователь").Равно(Справочники.ГруппыОповещенийПользователей.Инженер);
КонецПроцедуры
```
## Планы развития
Механизм предикатов:
* позволяет формировать наборы утверждений и передавать их в качества параметров;
* используется для проверки коллекций, записей базы и так далее;
* построен по модели текучих выражения и имеет схожий с базовыми утверждениями синтаксис (`ЮТест.ОжидаетЧто()`);
## Примеры использования
* Проверка коллекции
```bsl
ЮТест.ОжидаетЧто(Коллекция)
.ЛюбойЭлементСоответствуетПредикату(ЮТест.Предикат()
.Реквизит("Число").Равно(2)); // Проверят, что в коллекции есть элементы с реквизитом `Число`, которое равно `2`
ЮТест.ОжидаетЧто(Коллекция)
.КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
.Заполнено().ИмеетТип("Массив")); // Проверят, что каждый элемент коллекции это заполненный массив
```
* Описания параметров метода при мокировании
@ -26,11 +57,11 @@
```bsl
Мокито.Обучение(Модуль)
.Когда(Модуль.Посчитать(Мокито.Предикат()
.Когда(Модуль.Посчитать(ЮТест.Предикат()
.Реквизит("Оператор").Равно("Сложить")))
.ВернутьРезультат(Результат1)
.Когда(Модуль.Посчитать(Мокито.Предикат()
.Когда(Модуль.Посчитать(ЮТест.Предикат()
.Реквизит("Оператор").Равно("Вычесть")))
.ВернутьРезультат(Результат2);
```
@ -45,4 +76,57 @@
);
```
* Перевести обычные утверждения на предикаты
* Получение записей из базы
```bsl
ДанныеТовара = ЮТЗапросы.Запись("Справочник.Товары", ЮТест.Предикат()
.Реквизит("Наименование").Равно("Товар 1")
.Реквизит("Ссылка").НеРавно(Исключение));
```
## Особенности
### Особенности контекста
Предикаты как и большинство механизмов построены на текучих выражениях с сохранением состояния в глобальном контексте.
Это приводит к тому, что вы не можете сразу использовать несколько предикатов, например
```bsl
Мокито.Обучение(Модуль)
.Когда(Модуль.СделатьЧтоТо(
ЮТест.Предикат().ИмеетТип("Строка"),
ЮТест.Предикат().ИмеетТип("Число")))
.ВернутьРезультат(Результат1);
```
В этом примере 1С сначала вычислит выражения для всех параметров, а потом передаст их в метод и мы получим для обоих параметров один и тот же предикат, ожидающий тип `Число`.
Потому что состояние первого предиката будет заменено вторым. Для обхода этой проблемы можно использовать метод `Получить`, который возвращает текущее состояние.
```bsl
Мокито.Обучение(Модуль)
.Когда(Модуль.СделатьЧтоТо(
ЮТест.Предикат().ИмеетТип("Строка").Получить(),
ЮТест.Предикат().ИмеетТип("Число")))
.ВернутьРезультат(Результат1);
```
Такая же история при сохранение предикатов в переменные.
```bsl
ПроверкаСтрока = ЮТест.Предикат().ИмеетТип("Строка");
ПроверкаЧисло = ЮТест.Предикат().ИмеетТип("Число");
```
`ПроверкаСтрока` и `ПроверкаЧисло` будут равны и содержать одинаковые условия. Проблему также можно обойти используя метод `Получить`.
```bsl
ПроверкаСтрока = ЮТест.Предикат().ИмеетТип("Строка").Получить();
ПроверкаЧисло = ЮТест.Предикат().ИмеетТип("Число").Получить();
```
### Особенности реализации
Сам модуль предикатов используется только для формирования утверждений/условий.
Реализацией проверок и формированием условий занимаются другие модули и возможна ситуация, когда некоторые предикаты еще не реализованы или не поддерживаются каким-либо механизмом. Например, проверка заполненности не поддерживается запросами.

View File

@ -1,6 +1,7 @@
---
tags: [Getting started]
---
# Регистрация тестовых методов (ЮТТесты)
Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке.