mirror of
				https://github.com/bia-technologies/yaxunit.git
				synced 2025-10-31 00:07:47 +02:00 
			
		
		
		
	| @@ -1,6 +1,7 @@ | ||||
| --- | ||||
| tags: [Getting started, Mock] | ||||
| --- | ||||
|  | ||||
| # Мокито | ||||
|  | ||||
| Мокито - модуль созданный по образу популярного java-фреймворка для тестирования [Mockito](https://site.mockito.org/). Расширяет возможности тестирования, позволяет легко менять логику работы системы подменяя результаты работы методов, отключая какие-либо алгоритмы и проверки. | ||||
|   | ||||
| @@ -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 | ||||
| ПроверкаСтрока = ЮТест.Предикат().ИмеетТип("Строка").Получить(); | ||||
| ПроверкаЧисло = ЮТест.Предикат().ИмеетТип("Число").Получить(); | ||||
| ``` | ||||
|  | ||||
| ### Особенности реализации | ||||
|  | ||||
| Сам модуль предикатов используется только для формирования утверждений/условий.  | ||||
|  | ||||
| Реализацией проверок и формированием условий занимаются другие модули и возможна ситуация, когда некоторые предикаты еще не реализованы или не поддерживаются каким-либо механизмом. Например, проверка заполненности не поддерживается запросами. | ||||
| @@ -1,6 +1,7 @@ | ||||
| --- | ||||
| tags: [Getting started] | ||||
| --- | ||||
|  | ||||
| # Регистрация тестовых методов (ЮТТесты) | ||||
|  | ||||
| Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user