1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-11-30 08:36:50 +02:00
Получение статистики вызовов объекта через ссылку
Исправлена ошибка формирования сообщения об ошибке
Добавлена возможность указывать описание проверки
This commit is contained in:
alkoleft 2023-12-10 05:36:28 +03:00
parent bf95ea3875
commit 3dcd1e2250
11 changed files with 166 additions and 72 deletions

View File

@ -87,15 +87,15 @@
//
// Параметры:
// Объект - Произвольный - Устанавливает проверяемый объект, вызовы методов которого будем проверять.
//
// Описание - Строка - Описание проверки, которое будет выведено при возникновении ошибки
// Возвращаемое значение:
// ОбщийМодуль - см. МокитоПроверки
Функция Проверить(Объект) Экспорт
Функция Проверить(Объект, Описание = Неопределено) Экспорт
Режимы = МокитоСлужебный.РежимыРаботы();
МокитоСлужебный.УстановитьРежим(Режимы.Проверка);
Возврат МокитоПроверки.Проверить(Объект);
Возврат МокитоПроверки.Проверить(Объект, Описание);
КонецФункции

View File

@ -19,9 +19,9 @@
#Область ПрограммныйИнтерфейс
// см. Мокито.Проверить
Функция Проверить(Объект) Экспорт
Функция Проверить(Объект, Описание) Экспорт
УстановитьПараметрыПроверки(Объект);
УстановитьПараметрыПроверки(Объект, Описание);
Возврат МокитоПроверки;
КонецФункции
@ -70,11 +70,13 @@
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Равно(Количество, Знач Описание = Неопределено) Экспорт
Настройки = ПараметрыПроверки();
Статистика = СтатистикаВызовов();
ЮТУтверждения
.Что(Статистика, Описание)
.Что(Статистика, Настройки.Описание)
.ИмеющееПредставление(ОписаниеПроверяемогоОбъекта())
.ИмеетДлину(Количество);
.ИмеетДлину(Количество, Описание);
Возврат МокитоПроверки;
@ -168,17 +170,17 @@
// Структура:
// * ПроверяемыйОбъект - Произвольный
// * СтруктураВызоваМетода - см. МокитоСлужебный.СтруктураВызоваМетода
// * Описание - Строка
Функция ПараметрыПроверки()
Параметры = МокитоСлужебный.Настройки().ПараметрыПроверки;
Возврат Параметры;
Возврат МокитоСлужебный.Настройки().ПараметрыПроверки;
КонецФункции
Процедура УстановитьПараметрыПроверки(Объект = Неопределено, СтруктураВызоваМетода = Неопределено)
Процедура УстановитьПараметрыПроверки(Объект, Описание)
ПараметрыОбучения = Новый Структура("ПроверяемыйОбъект, СтруктураВызоваМетода", Объект, СтруктураВызоваМетода);
МокитоСлужебный.Настройки().ПараметрыПроверки = ПараметрыОбучения;
ПараметрыПроверки = Новый Структура("ПроверяемыйОбъект, Описание, СтруктураВызоваМетода", Объект, Описание);
МокитоСлужебный.Настройки().ПараметрыПроверки = ПараметрыПроверки;
КонецПроцедуры

View File

@ -298,17 +298,18 @@
Функция СтатистикаВызовов(Знач Объект, ИмяМетода) Экспорт
Если ЭтоОбъект(Объект) Тогда
Объект = Объект.Ссылка;
Вызовы = Настройки().Статистика.Вызовы;
СтатистикаВызововМетода = Новый Массив();
Статистика = Вызовы[Объект];
Если Статистика <> Неопределено И Статистика.Свойство(ИмяМетода) Тогда
СтатистикаВызововМетода = Статистика[ИмяМетода];
ИначеЕсли Статистика = Неопределено И ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗнч(Объект)) Тогда
СтатистикаВызововМетода = СтатистикаВызововПоСсылке(Вызовы, Объект, ИмяМетода);
КонецЕсли;
Статистика = Настройки().Статистика.Вызовы[Объект];
Если Статистика = Неопределено ИЛИ НЕ Статистика.Свойство(ИмяМетода) Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Статистика[ИмяМетода];
Возврат СтатистикаВызововМетода;
КонецФункции
@ -343,35 +344,6 @@
#Область ОбработкаВызовов
// Зарегистрировать вызов метода.
//
// Параметры:
// Настройки - см. ИнициализироватьНастройки
// ПараметрыПерехвата - см. ДанныеПерехвата
// СтруктураВызоваМетода - см. СтруктураВызоваМетода
Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода)
Объект = ПараметрыПерехвата.Объект;
ИмяМетода = СтруктураВызоваМетода.ИмяМетода;
Статистика = Настройки.Статистика.Вызовы[Объект];
Если Статистика = Неопределено Тогда
Статистика = Новый Структура;
Настройки.Статистика.Вызовы.Вставить(Объект, Статистика);
КонецЕсли;
Если НЕ Статистика.Свойство(ИмяМетода) Тогда
Статистика.Вставить(ИмяМетода, Новый Массив);
КонецЕсли;
Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода);
КонецПроцедуры
Функция ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение)
Если НЕ ПараметрыПерехвата.Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда
@ -539,7 +511,7 @@
#КонецОбласти
Функция ЭтоСсылка(Значение) Экспорт
Функция ЭтоСсылка(Значение)
Если Значение <> Неопределено Тогда
@ -556,7 +528,7 @@
КонецФункции
Функция ЭтоОбъект(Значение) Экспорт
Функция ЭтоОбъект(Значение)
Если Значение <> Неопределено И ЮТОбщий.ПеременнаяСодержитСвойство(Значение, "Ссылка") Тогда
@ -608,4 +580,54 @@
КонецФункции
#Область Статистика
// Зарегистрировать вызов метода.
//
// Параметры:
// Настройки - см. ИнициализироватьНастройки
// ПараметрыПерехвата - см. ДанныеПерехвата
// СтруктураВызоваМетода - см. СтруктураВызоваМетода
Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода)
Объект = СтруктураВызоваМетода.Объект;
ИмяМетода = СтруктураВызоваМетода.ИмяМетода;
Статистика = Настройки.Статистика.Вызовы[Объект];
Если Статистика = Неопределено Тогда
Статистика = Новый Структура;
Настройки.Статистика.Вызовы.Вставить(Объект, Статистика);
КонецЕсли;
Если НЕ Статистика.Свойство(ИмяМетода) Тогда
Статистика.Вставить(ИмяМетода, Новый Массив);
КонецЕсли;
Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода);
КонецПроцедуры
Функция СтатистикаВызововПоСсылке(Вызовы, Ссылка, ИмяМетода)
СтатистикаВызововМетода = Новый Массив();
Для Каждого Элемент Из Вызовы Цикл
ПодходящийЭлемент = ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗнч(Элемент.Ключ))
И Элемент.Ключ.Ссылка = Ссылка
И Элемент.Значение.Свойство(ИмяМетода);
Если ПодходящийЭлемент Тогда
ЮТОбщий.ДополнитьМассив(СтатистикаВызововМетода, Элемент.Значение[ИмяМетода]);
КонецЕсли;
КонецЦикла;
Возврат СтатистикаВызововМетода;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -361,12 +361,15 @@
//
Функция СкопироватьМассив(МассивИсточник) Экспорт
МассивРезультат = Новый Массив;
Если НЕ ЗначениеЗаполнено(МассивИсточник) Тогда
Возврат Новый Массив;
КонецЕсли;
Для Каждого Элемент Из МассивИсточник Цикл
МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент));
Размер = МассивИсточник.Количество();
МассивРезультат = Новый Массив(Размер);
Для Инд = 0 По Размер - 1 Цикл
МассивРезультат[Инд] = СкопироватьРекурсивно(МассивИсточник[Инд]);
КонецЦикла;
Возврат МассивРезультат;

View File

@ -328,9 +328,8 @@
Функция КлючЗаписи(Объект)
ТипЗначения = ТипЗнч(Объект);
ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗначения);
Если СтрНайти(ПредставлениеТипа, "Object.") Тогда
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
Возврат Объект.Ссылка;

View File

@ -102,6 +102,14 @@
КонецФункции
Функция ЭтоТипОбъекта(ТипЗначения) Экспорт
ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "Object.");
КонецФункции
#Область СистемныеПеречисления
Функция ЭтоСистемноеПеречисление(Тип) Экспорт

View File

@ -1828,13 +1828,13 @@
#Область Предикаты
Процедура ПроверитьПредикат(Выражение, ОжидаемоеЗначение, ОписаниеПроверки, ПараметрыСравнения = Неопределено)
Контекст = Контекст();
Предикат = ЮТФабрика.ВыражениеПредиката(Выражение, Контекст.ОбъектПроверки.ИмяСвойства, ОжидаемоеЗначение);
ПолноеОписаниеПроверки = ЮТОбщий.ДобавитьСтроку(Контекст.ПрефиксОшибки, ОписаниеПроверки, " ");
ПараметрыСообщенийОбОшибке = ЮТПредикатыКлиентСервер.ПараметрыСообщенийОбОшибке(ПолноеОписаниеПроверки);
ПараметрыСообщенийОбОшибке = ЮТПредикатыКлиентСервер.ПараметрыСообщенийОбОшибке(ПолноеОписаниеПроверки, , Контекст.ОбъектПроверки.Представление);
Результат = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Контекст.ОбъектПроверки.Значение, Предикат, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
ОбработатьРезультатПроверкиПредиката(Результат);

View File

@ -13,17 +13,7 @@
Продолжить;
КонецЕсли;
ВстречаОбъект.Начало = ОбрабатываемыйЭлемент.Начало;
ВстречаОбъект.Окончание = ОбрабатываемыйЭлемент.Конец;
Пользователь = ОбрабатываемыйЭлемент.Владелец;
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
КонецЕсли;
Владелец = Справочники.Пользователи.НайтиПоКоду(Пользователь);
ВстречаОбъект.Владелец = Владелец;
ЗаполнитьОбъект(ВстречаОбъект, ОбрабатываемыйЭлемент);
ВстречаОбъект.Записать();
КонецЦикла;
@ -41,3 +31,18 @@
Возврат Успешно;
КонецФункции
Процедура ЗаполнитьОбъект(Объект, ОбрабатываемыйЭлемент)
Объект.Начало = ОбрабатываемыйЭлемент.Начало;
Объект.Окончание = ОбрабатываемыйЭлемент.Конец;
Пользователь = ОбрабатываемыйЭлемент.Владелец;
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
КонецЕсли;
Владелец = Справочники.Пользователи.НайтиПоКоду(Пользователь.Имя);
Объект.Владелец = Владелец;
КонецПроцедуры

View File

@ -31,3 +31,17 @@
КонецЕсли;
КонецФункции
&Вместо("ЗаполнитьОбъект")
Процедура Расш1_ЗаполнитьОбъект(Объект, ОбрабатываемыйЭлемент) Экспорт
ПараметрыМетода = Мокито.МассивПараметров(Объект, ОбрабатываемыйЭлемент);
ПрерватьВыполнение = Ложь;
Мокито.АнализВызова(Справочники.Встречи, "ЗаполнитьОбъект", ПараметрыМетода, ПрерватьВыполнение);
Если НЕ ПрерватьВыполнение Тогда
ПродолжитьВызов(Объект, ОбрабатываемыйЭлемент);
КонецЕсли;
КонецПроцедуры

View File

@ -31,3 +31,17 @@
КонецЕсли;
КонецФункции
&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
ПараметрыМетода = Мокито.МассивПараметров(Отказ);
ПрерватьВыполнение = Ложь;
Мокито.АнализВызова(ЭтотОбъект, "ПередЗаписью", ПараметрыМетода, ПрерватьВыполнение);
Если НЕ ПрерватьВыполнение Тогда
ПродолжитьВызов(Отказ);
КонецЕсли;
КонецПроцедуры

View File

@ -28,6 +28,7 @@
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции()
.ДобавитьТест("ОшибкаПодбораРеакции")
.ДобавитьТест("ИспользованиеПредикатов")
.ДобавитьСерверныйТест("МокированиеЧерезМенеджер")
;
КонецПроцедуры
@ -197,6 +198,32 @@
.Равно(Результат);
КонецПроцедуры
Процедура МокированиеЧерезМенеджер() Экспорт
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ОбменДаннымиЗагрузка = Истина;
Запись = Новый Структура("Встреча, Начало, Конец, Владелец");
Запись.Встреча = ЮТест.Данные().СоздатьЭлемент(Справочники.Встречи, , , ПараметрыЗаписи);
Мокито.Обучение(Справочники.Встречи)
.Наблюдать("СохранитьИзменения")
.Наблюдать("ЗаполнитьОбъект")
.Наблюдать("ПередЗаписью")
.Прогон();
Справочники.Встречи.СохранитьИзменения(ЮТОбщий.ЗначениеВМассиве(Запись));
Мокито.Проверить(Справочники.Встречи, "Проверка через менеджер")
.КоличествоВызовов("ЗаполнитьОбъект").Равно(1)
;
Мокито.Проверить(Запись.Встреча, "Проверка через ссылку")
.КоличествоВызовов("ПередЗаписью").Равно(1)
;
КонецПроцедуры
#КонецЕсли
Процедура Прогон_НакоплениеСтатистики(НакоплениеСтатистики) Экспорт