From 1fe079131db3af48ebf8bc97f3d3991619f7af15 Mon Sep 17 00:00:00 2001 From: alkoleft Date: Wed, 4 Oct 2023 00:18:39 +0300 Subject: [PATCH] #172 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Выполнение проверки метода в транзакции --- .../CommonModules/ЮТУтверждения/Module.bsl | 32 +++++++-- .../CommonModules/ОМ_ЮТУтверждения/Module.bsl | 67 +++++++++++++++++++ 2 files changed, 94 insertions(+), 5 deletions(-) diff --git a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl index 9358f374..f6fafa04 100644 --- a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl @@ -777,16 +777,17 @@ // Параметры: // ОжидаемоеЗначение - Строка - Ожидается, что сообщение об ошибке будет содержать данный текст // ОписаниеПроверки - Строка - Описание конкретной проверки +// ВТранзакции - Булево - Вызов метода выполняется в трананзакции // // Возвращаемое значение: // ОбщийМодуль - Этот модуль для замыкания -Функция ВыбрасываетИсключение(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт +Функция ВыбрасываетИсключение(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено, ВТранзакции = Ложь) Экспорт Контекст = Контекст(); УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки); Попытка Модуль = ПроверяемоеЗначение(Контекст); - Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода); + Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода, ВТранзакции); Исключение ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст); КонецПопытки; @@ -814,16 +815,17 @@ // Параметры: // ОжидаемоеЗначение - Строка - Ожидается, что сообщение об ошибке НЕ будет содержать данный текст // ОписаниеПроверки - Строка - Описание конкретной проверки +// ВТранзакции - Булево - Вызов метода выполняется в трананзакции // // Возвращаемое значение: // ОбщийМодуль - Этот модуль для замыкания -Функция НеВыбрасываетИсключение(Знач ОжидаемоеЗначение = Неопределено, Знач ОписаниеПроверки = Неопределено) Экспорт +Функция НеВыбрасываетИсключение(Знач ОжидаемоеЗначение = Неопределено, Знач ОписаниеПроверки = Неопределено, ВТранзакции = Ложь) Экспорт Контекст = Контекст(); УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки); Попытка Модуль = ПроверяемоеЗначение(Контекст); - Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода) + Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода, ВТранзакции); Исключение ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст); КонецПопытки; @@ -1491,7 +1493,7 @@ КонецФункции -Функция ВызватьМетод(Модуль, ИмяМетода, ПараметрыМетода) +Функция ВызватьМетод(Модуль, ИмяМетода, ПараметрыМетода, ВТранзакции) #Если ВебКлиент Тогда ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТУтверждения.ВызватьМетод"); @@ -1518,6 +1520,26 @@ Результат = Новый Структура("ИсключениеВозникло, ТекстИсключения", Ложь); +#Если Сервер Тогда + Если ВТранзакции Тогда + Если ТранзакцияАктивна() Тогда + ВызватьИсключение "Использование транзакции внтури транзакции при проверке метода недопустимо"; + КонецЕсли; + + Попытка + НачатьТранзакцию(); + //@skip-check server-execution-safe-mode + Выполнить(СтрокаДляВыполнения); + Исключение + Результат.ИсключениеВозникло = Истина; + Результат.ТекстИсключения = ОписаниеОшибки(); + КонецПопытки; + ОтменитьТранзакцию(); + + Возврат Результат; + КонецЕсли; +#КонецЕсли + Попытка //@skip-check server-execution-safe-mode Выполнить(СтрокаДляВыполнения); diff --git a/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl b/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl index a7a79f1b..5bd49f06 100644 --- a/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl @@ -55,6 +55,7 @@ .ДобавитьТест("НеИмеетДлину") .ДобавитьТест("ВыбрасываетИсключение") .ДобавитьТест("НеВыбрасываетИсключение") + .ДобавитьСерверныйТест("ПроверкаМетодаВТранзакции") .ДобавитьСерверныйТест("СравнениеСложныхОбъектов") .ДобавитьТест("ФормированиеСообщения") .ДобавитьТест("НачинаетсяС") @@ -1682,6 +1683,65 @@ КонецПроцедуры #Если Сервер Тогда + +Процедура ПроверкаМетодаВТранзакции() Экспорт + + Объект = ЮТест.Данные().КонструкторОбъекта(Справочники.Банки) + .ФикцияОбязательныхПолей() + .НовыйОбъект(); + + ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("ЗаписатьОбъект").Параметр(Объект) + .НеВыбрасываетИсключение(, , Истина); + + ЮТест.ОжидаетЧто(Объект) + .Свойство("Ссылка").НеЗаполнено(); + + Попытка + НачатьТранзакцию(); + ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("ЗаписатьОбъект").Параметр(Объект) + .НеВыбрасываетИсключение(); + + ЮТест.ОжидаетЧто(Объект) + .Свойство("Ссылка").Заполнено(); + ОтменитьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Объект = ЮТест.Данные().КонструкторОбъекта(Справочники.Банки) + .ФикцияОбязательныхПолей() + .НовыйОбъект(); + + Ошибка = Неопределено; + Попытка + НачатьТранзакцию(); + ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("ЗаписатьОбъект").Параметр(Объект) + .ВыбрасываетИсключение("Не удалось", , Истина); + ОтменитьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + Ошибка = ИнформацияОбОшибке(); + КонецПопытки; + ПроверитьОшибкуИсполнения(Ошибка, "Использование транзакции внтури транзакции при проверке метода недопустимо"); + + Ошибка = Неопределено; + Попытка + ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("ЗаписатьОбъект").Параметр(Объект) + .ВыбрасываетИсключение("Не удалось", , Истина); + Исключение + Ошибка = ИнформацияОбОшибке(); + КонецПопытки; + ПроверитьОшибкуУтверждения(Ошибка, "вызовет исключение"); + ЮТест.ОжидаетЧто(Объект) + .Свойство("Ссылка").НеЗаполнено(); + +КонецПроцедуры + Процедура СравнениеСложныхОбъектов() Экспорт Варианты = Новый Массив(); @@ -2339,6 +2399,13 @@ КонецФункции +Функция ЗаписатьОбъект(Объект) Экспорт + + Объект.Записать(); + Возврат Объект; + +КонецФункции + Функция ДанныеДляПроверкиКоллекции(Знач ВернутьСтруктуру = Неопределено) Если ВернутьСтруктуру = Неопределено Тогда