1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-03-17 20:48:01 +02:00

Merge pull request #103 from bia-technologies/feature/98

Мокито и предикаты
This commit is contained in:
Koryakin Aleksey 2023-05-24 12:14:00 +03:00 committed by GitHub
commit 1a909285a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 124 additions and 42 deletions

View File

@ -151,7 +151,6 @@
//
// Возвращаемое значение:
// Структура - Описание маски параметра:
// * МаскаСопоставленияПараметров - Булево - Признак, что это маска параметра (значение: `Истина`)
// * Режим - Строка - Тип маски (значение: `Тип`)
// * Приоритет - Число - Приоритет маски, используется если значение подпадает под несколько масок (значение: `10`)
// * Тип - Тип - Тип, которому должен соответствовать параметр

View File

@ -202,35 +202,8 @@
Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода)
Возврат Новый Структура("УсловиеРеакции, Действие", УсловиеРеакции(СтруктураВызоваМетода), Неопределено);
КонецФункции
Функция УсловиеРеакции(СтруктураВызоваМетода)
Параметры = СтруктураВызоваМетода.Параметры;
Если Параметры = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Условия = Новый Массив;
Для Каждого Параметр Из Параметры Цикл
Если МокитоСлужебный.ЭтоМаскаПарамера(Параметр) Тогда
Условия.Добавить(Параметр);
Иначе
Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 100));
КонецЕсли;
КонецЦикла;
Возврат Условия;
Условия = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Возврат Новый Структура("УсловиеРеакции, Действие", Условия, Неопределено);
КонецФункции

View File

@ -213,11 +213,7 @@
Параметр = ВызовМетода.Параметры[Инд];
Условие = СтруктураВызоваМетода.Параметры[Инд];
Если МокитоСлужебный.ЭтоМаскаПарамера(Условие) Тогда
Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие);
Иначе
Успешно = ЮТСравнениеКлиентСервер.ЗначенияРавны(Параметр, Условие);
КонецЕсли;
Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие);
Если НЕ Успешно Тогда
Прервать;
@ -258,7 +254,8 @@
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова);
Условия = МокитоСлужебный.УсловиеИзПараметров(ПараметрыВызова);
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, Условия);
КонецЕсли;
Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда

View File

@ -159,6 +159,7 @@
Типы.Вставить("Значение", "Значение");
Типы.Вставить("Тип", "Тип");
Типы.Вставить("ОписаниеТипа", "ОписаниеТипа");
Типы.Вставить("Предикат", "Предикат");
Возврат Новый ФиксированнаяСтруктура(Типы);
@ -172,12 +173,13 @@
//
// Возвращаемое значение:
// Структура - Описание маски параметра:
// * МаскаСопоставленияПараметров - Булево - Признак, что это маска параметра
// * Режим - Строка - см. ТипыУсловийПараметров
// * Приоритет - Число - Приоритет маски, используется если значение подпадает под несколько масок, чем выше приоритет, тем лучше
Функция ОписаниеМаскиПараметра(ТипУсловия, Приоритет) Экспорт
МаскаПараметра = Новый Структура("МаскаСопоставленияПараметров", Истина);
МаскаПараметра = Новый Структура;
ЮТОбщий.УказатьТипСтруктуры(МаскаПараметра, "МаскаПараметра");
МаскаПараметра.Вставить("Режим", ТипУсловия);
МаскаПараметра.Вставить("Приоритет", Приоритет);
@ -187,7 +189,7 @@
Функция ЭтоМаскаПарамера(Параметр) Экспорт
Возврат ТипЗнч(Параметр) = Тип("Структура") И Параметр.Свойство("МаскаСопоставленияПараметров") И Параметр.МаскаСопоставленияПараметров;
Возврат ТипЗнч(Параметр) = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Параметр) = "МаскаПараметра";
КонецФункции
@ -212,6 +214,11 @@
Совпадает = Условие.Тип.СодержитТип(ТипЗнч(Параметр));
ИначеЕсли Условие.Режим = ТипыУсловий.Предикат Тогда
Результат = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Параметр, Условие.Предикат);
Совпадает = Результат.Успешно;
КонецЕсли;
Возврат Совпадает;
@ -565,4 +572,40 @@
КонецФункции
Функция УсловиеИзПараметров(Параметры) Экспорт
Если Параметры = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Условия = Новый Массив;
ТипыУсловий = ТипыУсловийПараметров();
Для Каждого Параметр Из Параметры Цикл
Если ЭтоМаскаПарамера(Параметр) Тогда
Условия.Добавить(Параметр);
ИначеЕсли ЮТПредикатыКлиентСервер.ЭтоПредикат(Параметр) Тогда
Маска = ОписаниеМаскиПараметра(ТипыУсловий.Предикат, 90);
Маска.Вставить("Предикат", ЮТПредикатыКлиентСервер.НаборПредикатов(Параметр));
Условия.Добавить(Маска);
Иначе
Маска = ОписаниеМаскиПараметра(ТипыУсловий.Значение, 100);
Маска.Вставить("Значение", Параметр);
Условия.Добавить(Маска);
КонецЕсли;
КонецЦикла;
Возврат Условия;
КонецФункции
#КонецОбласти

View File

@ -829,6 +829,18 @@
КонецФункции
Функция ТипСтруктуры(Структура) Экспорт
Возврат ЗначениеСтруктуры(Структура, "__type__");
КонецФункции
Процедура УказатьТипСтруктуры(Структура, ИмяТипа) Экспорт
Структура.Вставить("__type__", ИмяТипа);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -66,9 +66,9 @@
Если ТипПараметра = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты Тогда
Результат = ЮТПредикаты.Получить();
ИначеЕсли ТипПараметра = Тип("Массив") Тогда
ИначеЕсли ТипПараметра = Тип("Массив") И (Предикаты.Количество() = 0 ИЛИ ЮТОбщий.ТипСтруктуры(Предикаты[0]) = "Предикат") Тогда
Результат = Предикаты;
ИначеЕсли ТипПараметра = Тип("Структура") Тогда
ИначеЕсли ТипПараметра = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат" Тогда
Результат = ЮТОбщий.ЗначениеВМассиве(Предикаты);
Иначе
ВызватьИсключение "Некорректный параметр метода `ЮТПредикатыКлиентСервер.НаборПредикатов`";
@ -78,6 +78,15 @@
КонецФункции
Функция ЭтоПредикат(Предикаты) Экспорт
ТипПараметра = ТипЗнч(Предикаты);
Возврат (ТипПараметра = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты)
ИЛИ (ТипПараметра = Тип("Массив") И Предикаты.Количество() И ЮТОбщий.ТипСтруктуры(Предикаты[0]) = "Предикат")
ИЛИ (ТипПараметра = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат");
КонецФункции
Функция ПредставлениеПредикатов(Знач Предикаты, Разделитель, ШаблонСвойства = "содержит свойство `%1`, которое") Экспорт
Представления = Новый Массив();

View File

@ -645,10 +645,12 @@
// Структура - Выражение предиката:
// * ИмяРеквизита - Неопределено, Строка - Имя проверяемого реквизита
// * ВидСравнения - Строка
// * Значение - Произвольный
// * Значение - Произвольный, Неопределено - Операнд выражения
Функция ВыражениеПредиката(ВидСравнения, ИмяРеквизита = Неопределено, Значение = Неопределено) Экспорт
Выражение = Новый Структура();
ЮТОбщий.УказатьТипСтруктуры(Выражение, "Предикат");
Выражение.Вставить("ИмяРеквизита", ИмяРеквизита);
Выражение.Вставить("ВидСравнения", ВидСравнения);
Выражение.Вставить("Значение", Значение);

View File

@ -27,6 +27,7 @@
.ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь)
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции()
.ДобавитьТест("ОшибкаПодбораРеакции")
.ДобавитьТест("ИспользованиеПредикатов")
;
КонецПроцедуры
@ -255,7 +256,53 @@
ЮТУтверждения.Что(Интеграция.ВыполнитьЗапрос("sessions")).Равно(403);
КонецПроцедуры
Процедура ИспользованиеПредикатов() Экспорт
ЛюбойПараметр = Мокито.ЛюбойПараметр();
УсловиеСтруктура = ЮТест.Предикат()
.ИмеетТип("Структура")
.Реквизит("Флаг").Равно(1)
.Получить();
Адрес = "service.ru";
Мокито.Обучение(Интеграция)
.Когда("ВыполнитьЗапрос")
.ВыброситьИсключение("Не отработал перехват")
.Когда("ВыполнитьЗапрос", Мокито.МассивПараметров(ЛюбойПараметр, УсловиеСтруктура))
.Вернуть(1)
.Когда("ВыполнитьЗапрос", Мокито.МассивПараметров(ЛюбойПараметр, ЮТест.Предикат().Реквизит("Флаг").Равно(2)))
.Вернуть(2)
.Когда("ВыполнитьЗапрос", Мокито.МассивПараметров(ЛюбойПараметр, ЮТест.Предикат().ИмеетТип("Массив").Реквизит(0).Равно(3)))
.Вернуть(3)
.Когда("ВыполнитьЗапрос", Мокито.МассивПараметров(ЛюбойПараметр, ЮТест.Предикат().Равно(4)))
.Вернуть(4)
.Когда("ВыполнитьЗапрос", Мокито.МассивПараметров(ЮТест.Предикат().Содержит("com"), ЮТест.Предикат().Равно(4)))
.Вернуть(5)
.Когда("ВыполнитьЗапрос", Мокито.МассивПараметров(ЮТест.Предикат().Содержит("org").Получить(), ЮТест.Предикат().Равно(4)))
.Вернуть(6)
.Прогон()
;
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес, Новый Структура("Флаг", 1)))
.Равно(1);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес, 4))
.Равно(4);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос("service.com", 4))
.Равно(4); // Не вернет 5, потому что если несколько предиктов в условиях параметров, нужно использовать Получить
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос("service.org", 4))
.Равно(6); //
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес, ЮТОбщий.ЗначениеВМассиве(3)))
.Равно(3);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(Адрес, Новый Структура("Флаг", 2)))
.Равно(2);
Мокито.Проверить(Интеграция)
.КоличествоВызовов("ВыполнитьЗапрос").Равно(6)
.КоличествоВызовов("ВыполнитьЗапрос", Мокито.МассивПараметров(ЮТест.Предикат().Содержит("ru"))).Равно(4)
.КоличествоВызовов("ВыполнитьЗапрос", Мокито.МассивПараметров(ЛюбойПараметр, Новый Структура("Флаг", 2))).Равно(1)
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции