From daaf56474574aa77769a2436dbaf68587f5bf9ae Mon Sep 17 00:00:00 2001 From: alkoleft Date: Sat, 20 May 2023 01:13:50 +0300 Subject: [PATCH 1/2] #98 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Моки и предикаты, использование при обучении --- exts/yaxunit/src/CommonModules/Мокито/Module.bsl | 1 - .../src/CommonModules/МокитоОбучение/Module.bsl | 12 +++++++++++- .../src/CommonModules/МокитоСлужебный/Module.bsl | 13 ++++++++++--- exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl | 12 ++++++++++++ .../ЮТПредикатыКлиентСервер/Module.bsl | 13 +++++++++++-- exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl | 4 +++- tests/src/CommonModules/ОМ_Мокито/Module.bsl | 7 +++++++ 7 files changed, 54 insertions(+), 8 deletions(-) diff --git a/exts/yaxunit/src/CommonModules/Мокито/Module.bsl b/exts/yaxunit/src/CommonModules/Мокито/Module.bsl index 19b5e67e..c8ecad4a 100644 --- a/exts/yaxunit/src/CommonModules/Мокито/Module.bsl +++ b/exts/yaxunit/src/CommonModules/Мокито/Module.bsl @@ -151,7 +151,6 @@ // // Возвращаемое значение: // Структура - Описание маски параметра: -// * МаскаСопоставленияПараметров - Булево - Признак, что это маска параметра (значение: `Истина`) // * Режим - Строка - Тип маски (значение: `Тип`) // * Приоритет - Число - Приоритет маски, используется если значение подпадает под несколько масок (значение: `10`) // * Тип - Тип - Тип, которому должен соответствовать параметр diff --git a/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl index 99ea02b9..3b707098 100644 --- a/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl +++ b/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl @@ -216,15 +216,25 @@ Условия = Новый Массив; + ТипыУсловий = МокитоСлужебный.ТипыУсловийПараметров(); + Для Каждого Параметр Из Параметры Цикл Если МокитоСлужебный.ЭтоМаскаПарамера(Параметр) Тогда Условия.Добавить(Параметр); + ИначеЕсли ЮТПредикатыКлиентСервер.ЭтоПредикат(Параметр) Тогда + + Маска = МокитоСлужебный.ОписаниеМаскиПараметра(ТипыУсловий.Предикат, 90); + Маска.Вставить("Предикат", ЮТПредикатыКлиентСервер.НаборПредикатов(Параметр)); + Условия.Добавить(Маска); + Иначе - Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 100)); + Маска = МокитоСлужебный.ОписаниеМаскиПараметра(ТипыУсловий.Значение, 100); + Маска.Вставить("Значение", Параметр); + Условия.Добавить(Маска); КонецЕсли; diff --git a/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl index b77d7251..86ed07b4 100644 --- a/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl +++ b/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl @@ -159,6 +159,7 @@ Типы.Вставить("Значение", "Значение"); Типы.Вставить("Тип", "Тип"); Типы.Вставить("ОписаниеТипа", "ОписаниеТипа"); + Типы.Вставить("Предикат", "Предикат"); Возврат Новый ФиксированнаяСтруктура(Типы); @@ -172,12 +173,13 @@ // // Возвращаемое значение: // Структура - Описание маски параметра: -// * МаскаСопоставленияПараметров - Булево - Признак, что это маска параметра // * Режим - Строка - см. ТипыУсловийПараметров // * Приоритет - Число - Приоритет маски, используется если значение подпадает под несколько масок, чем выше приоритет, тем лучше Функция ОписаниеМаскиПараметра(ТипУсловия, Приоритет) Экспорт - МаскаПараметра = Новый Структура("МаскаСопоставленияПараметров", Истина); + МаскаПараметра = Новый Структура; + ЮТОбщий.УказатьТипСтруктуры(МаскаПараметра, "МаскаПараметра"); + МаскаПараметра.Вставить("Режим", ТипУсловия); МаскаПараметра.Вставить("Приоритет", Приоритет); @@ -187,7 +189,7 @@ Функция ЭтоМаскаПарамера(Параметр) Экспорт - Возврат ТипЗнч(Параметр) = Тип("Структура") И Параметр.Свойство("МаскаСопоставленияПараметров") И Параметр.МаскаСопоставленияПараметров; + Возврат ТипЗнч(Параметр) = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Параметр) = "МаскаПараметра"; КонецФункции @@ -212,6 +214,11 @@ Совпадает = Условие.Тип.СодержитТип(ТипЗнч(Параметр)); + ИначеЕсли Условие.Режим = ТипыУсловий.Предикат Тогда + + Результат = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Параметр, Условие.Предикат); + Совпадает = Результат.Успешно; + КонецЕсли; Возврат Совпадает; diff --git a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl index fad62160..181fd8b5 100644 --- a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl @@ -830,6 +830,18 @@ КонецФункции +Функция ТипСтруктуры(Структура) Экспорт + + Возврат ЗначениеСтруктуры(Структура, "__type__"); + +КонецФункции + +Процедура УказатьТипСтруктуры(Структура, ИмяТипа) Экспорт + + Структура.Вставить("__type__", ИмяТипа); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl index 18a26edd..68eaa550 100644 --- a/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТПредикатыКлиентСервер/Module.bsl @@ -66,9 +66,9 @@ Если ТипПараметра = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты Тогда Результат = ЮТПредикаты.Получить(); - ИначеЕсли ТипПараметра = Тип("Массив") Тогда + ИначеЕсли ТипПараметра = Тип("Массив") И (Предикаты.Количество() = 0 ИЛИ ЮТОбщий.ТипСтруктуры(Предикаты[0]) = "Предикат") Тогда Результат = Предикаты; - ИначеЕсли ТипПараметра = Тип("Структура") Тогда + ИначеЕсли ТипПараметра = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат" Тогда Результат = ЮТОбщий.ЗначениеВМассиве(Предикаты); Иначе ВызватьИсключение "Некорректный параметр метода `ЮТПредикатыКлиентСервер.НаборПредикатов`"; @@ -78,6 +78,15 @@ КонецФункции +Функция ЭтоПредикат(Предикаты) Экспорт + + ТипПараметра = ТипЗнч(Предикаты); + Возврат (ТипПараметра = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты) + ИЛИ (ТипПараметра = Тип("Массив") И Предикаты.Количество() И ЮТОбщий.ТипСтруктуры(Предикаты[0]) = "Предикат") + ИЛИ (ТипПараметра = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат"); + +КонецФункции + Функция ПредставлениеПредикатов(Знач Предикаты, Разделитель, ШаблонСвойства = "содержит свойство `%1`, которое") Экспорт Представления = Новый Массив(); diff --git a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl index 6f92f07c..8b329393 100644 --- a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl @@ -645,10 +645,12 @@ // Структура - Выражение предиката: // * ИмяРеквизита - Неопределено, Строка - Имя проверяемого реквизита // * ВидСравнения - Строка -// * Значение - Произвольный +// * Значение - Произвольный, Неопределено - Операнд выражения Функция ВыражениеПредиката(ВидСравнения, ИмяРеквизита = Неопределено, Значение = Неопределено) Экспорт Выражение = Новый Структура(); + ЮТОбщий.УказатьТипСтруктуры(Выражение, "Предикат"); + Выражение.Вставить("ИмяРеквизита", ИмяРеквизита); Выражение.Вставить("ВидСравнения", ВидСравнения); Выражение.Вставить("Значение", Значение); diff --git a/tests/src/CommonModules/ОМ_Мокито/Module.bsl b/tests/src/CommonModules/ОМ_Мокито/Module.bsl index e55dd824..bc50ba7d 100644 --- a/tests/src/CommonModules/ОМ_Мокито/Module.bsl +++ b/tests/src/CommonModules/ОМ_Мокито/Module.bsl @@ -27,6 +27,7 @@ .ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь) .ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции() .ДобавитьТест("ОшибкаПодбораРеакции") + .ДобавитьТест("ИспользованиеПредикатов") ; КонецПроцедуры @@ -255,7 +256,13 @@ ЮТУтверждения.Что(Интеграция.ВыполнитьЗапрос("sessions")).Равно(403); КонецПроцедуры + +Процедура ИспользованиеПредикатов() Экспорт + ВызватьИсключение "Не реализовано"; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции From 9f4d5664c4a7a5843ad7a3742f91110e11882bdd Mon Sep 17 00:00:00 2001 From: alkoleft Date: Sat, 20 May 2023 01:26:43 +0300 Subject: [PATCH 2/2] #98 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Моки и предикаты, использование в проверках --- .../CommonModules/МокитоОбучение/Module.bsl | 41 +----------------- .../CommonModules/МокитоПроверки/Module.bsl | 9 ++-- .../CommonModules/МокитоСлужебный/Module.bsl | 36 ++++++++++++++++ tests/src/CommonModules/ОМ_Мокито/Module.bsl | 42 ++++++++++++++++++- 4 files changed, 82 insertions(+), 46 deletions(-) diff --git a/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl index 3b707098..8bbd95e7 100644 --- a/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl +++ b/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl @@ -202,45 +202,8 @@ Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода) - Возврат Новый Структура("УсловиеРеакции, Действие", УсловиеРеакции(СтруктураВызоваМетода), Неопределено); - -КонецФункции - -Функция УсловиеРеакции(СтруктураВызоваМетода) - - Параметры = СтруктураВызоваМетода.Параметры; - - Если Параметры = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Условия = Новый Массив; - - ТипыУсловий = МокитоСлужебный.ТипыУсловийПараметров(); - - Для Каждого Параметр Из Параметры Цикл - - Если МокитоСлужебный.ЭтоМаскаПарамера(Параметр) Тогда - - Условия.Добавить(Параметр); - - ИначеЕсли ЮТПредикатыКлиентСервер.ЭтоПредикат(Параметр) Тогда - - Маска = МокитоСлужебный.ОписаниеМаскиПараметра(ТипыУсловий.Предикат, 90); - Маска.Вставить("Предикат", ЮТПредикатыКлиентСервер.НаборПредикатов(Параметр)); - Условия.Добавить(Маска); - - Иначе - - Маска = МокитоСлужебный.ОписаниеМаскиПараметра(ТипыУсловий.Значение, 100); - Маска.Вставить("Значение", Параметр); - Условия.Добавить(Маска); - - КонецЕсли; - - КонецЦикла; - - Возврат Условия; + Условия = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры); + Возврат Новый Структура("УсловиеРеакции, Действие", Условия, Неопределено); КонецФункции diff --git a/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl index 2ce00f5e..c3c5c6bb 100644 --- a/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl +++ b/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl @@ -213,11 +213,7 @@ Параметр = ВызовМетода.Параметры[Инд]; Условие = СтруктураВызоваМетода.Параметры[Инд]; - Если МокитоСлужебный.ЭтоМаскаПарамера(Условие) Тогда - Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие); - Иначе - Успешно = ЮТСравнениеКлиентСервер.ЗначенияРавны(Параметр, Условие); - КонецЕсли; + Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие); Если НЕ Успешно Тогда Прервать; @@ -258,7 +254,8 @@ Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда СтруктураВызоваМетода = ИмяМетода; Иначе - СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова); + Условия = МокитоСлужебный.УсловиеИзПараметров(ПараметрыВызова); + СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, Условия); КонецЕсли; Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда diff --git a/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl index 86ed07b4..4d2adc6a 100644 --- a/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl +++ b/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl @@ -572,4 +572,40 @@ КонецФункции +Функция УсловиеИзПараметров(Параметры) Экспорт + + Если Параметры = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Условия = Новый Массив; + + ТипыУсловий = ТипыУсловийПараметров(); + + Для Каждого Параметр Из Параметры Цикл + + Если ЭтоМаскаПарамера(Параметр) Тогда + + Условия.Добавить(Параметр); + + ИначеЕсли ЮТПредикатыКлиентСервер.ЭтоПредикат(Параметр) Тогда + + Маска = ОписаниеМаскиПараметра(ТипыУсловий.Предикат, 90); + Маска.Вставить("Предикат", ЮТПредикатыКлиентСервер.НаборПредикатов(Параметр)); + Условия.Добавить(Маска); + + Иначе + + Маска = ОписаниеМаскиПараметра(ТипыУсловий.Значение, 100); + Маска.Вставить("Значение", Параметр); + Условия.Добавить(Маска); + + КонецЕсли; + + КонецЦикла; + + Возврат Условия; + +КонецФункции + #КонецОбласти diff --git a/tests/src/CommonModules/ОМ_Мокито/Module.bsl b/tests/src/CommonModules/ОМ_Мокито/Module.bsl index bc50ba7d..5cec2fe3 100644 --- a/tests/src/CommonModules/ОМ_Мокито/Module.bsl +++ b/tests/src/CommonModules/ОМ_Мокито/Module.bsl @@ -259,8 +259,48 @@ Процедура ИспользованиеПредикатов() Экспорт - ВызватьИсключение "Не реализовано"; + ЛюбойПараметр = Мокито.ЛюбойПараметр(); + УсловиеСтруктура = ЮТест.Предикат() + .ИмеетТип("Структура") + .Реквизит("Флаг").Равно(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) КонецПроцедуры #КонецОбласти