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-11 01:39:21 +03:00
parent 374528eee1
commit 4a9a5ab96e
4 changed files with 122 additions and 19 deletions

View File

@ -164,15 +164,22 @@
Процедура ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова)
Объект = ОбучаемыйОбъект();
ДанныеПерехвата = МокитоСлужебный.ДанныеПерехвата(Объект);
ПереданаСтруктураВызоваМетода = МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода);
Если ПереданаСтруктураВызоваМетода Тогда
Объект = ИмяМетода.Объект;
Иначе
Объект = ОбучаемыйОбъект();
КонецЕсли;
ДанныеПерехвата = МокитоСлужебный.НастройкиПерехватаОбъекта(Объект);
Если ДанныеПерехвата = Неопределено Тогда
Сообщение = СтрШаблон("Не найдены настройки перехвата для %1. Необходимо предварительно вызвать метод Мокито.Обучение(Объект)", Объект);
ВызватьИсключение Сообщение;
КонецЕсли;
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
Если ПереданаСтруктураВызоваМетода Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыВызова);

View File

@ -35,15 +35,7 @@
// Настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Перехват - Соответствие
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
// см. НовыеНастройки
Функция Настройки() Экспорт
Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек());
@ -93,6 +85,10 @@
Настройки = Настройки();
Если НЕ ЗначениеЗаполнено(Настройки.Перехват) Или Настройки.ТипыПерехватываемыхОбъектов[ТипЗнч(Объект)] = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ПараметрыПерехвата = ДанныеПерехвата(Объект, Настройки);
Если ПараметрыПерехвата = Неопределено Тогда
@ -234,11 +230,18 @@
КонецФункции
Функция НастройкиПерехватаОбъекта(Объект) Экспорт
ПараметрыПерехвата = ПараметрыПерехвата();
Возврат ПараметрыПерехвата[Объект];
КонецФункции
// Данные перехвата.
//
// Параметры:
// Объект - Произвольный
// Настройки - см. Настройки
// Настройки - см. НовыеНастройки
//
// Возвращаемое значение:
// см. ОписаниеПараметровПерехватаОбъекта
@ -282,12 +285,35 @@
Процедура ДобавитьНастройкуПерехватаВызововОбъекта(Знач Объект, СброситьСтарыеНастройки = Истина) Экспорт
ПараметрыПерехвата = ПараметрыПерехвата();
Настройки = Настройки();
Если СброситьСтарыеНастройки ИЛИ ПараметрыПерехвата[Объект] = Неопределено Тогда
ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
Если СброситьСтарыеНастройки ИЛИ Настройки.Перехват[Объект] = Неопределено Тогда
Настройки.Перехват.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
КонецЕсли;
ТипОбъекта = ТипЗнч(Объект);
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
Если ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипОбъекта) Тогда
ТипОбъекта = ЮТТипыДанныхСлужебный.ТипОбъектаСсылки(ТипОбъекта);
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипМенеджера(ТипОбъекта) Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(ТипОбъекта);
Если Описание <> Неопределено Тогда
Если Описание.ОписаниеТипа.Ссылочный Тогда
ТипОбъекта = Тип(СтрШаблон("%1Объект.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
Иначе
ТипОбъекта = Тип(СтрШаблон("%НаборЗаписей.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
КонецЕсли;
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
КонецЕсли;
#КонецЕсли
КонецЕсли;
КонецПроцедуры
// Описание параметров перехвата объекта.
@ -315,11 +341,16 @@
СтатистикаВызововМетода = Новый Массив();
Статистика = Вызовы[Объект];
ТипОбъекта = ТипЗнч(Объект);
Если Статистика <> Неопределено И Статистика.Свойство(ИмяМетода) Тогда
СтатистикаВызововМетода = Статистика[ИмяМетода];
ИначеЕсли Статистика = Неопределено И ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗнч(Объект)) Тогда
ИначеЕсли Статистика = Неопределено И ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипОбъекта) Тогда
СтатистикаВызововМетода = СтатистикаВызововПоСсылке(Вызовы, Объект, ИмяМетода);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипМенеджера(ТипОбъекта) Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
СтатистикаВызововМетода = СтатистикаВызововПоМенеджеру(Вызовы, Объект, ИмяМетода);
#КонецЕсли
КонецЕсли;
Возврат СтатистикаВызововМетода;
@ -480,19 +511,39 @@
Процедура ИнициализироватьНастройки() Экспорт
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), НовыеНастройки(), Истина);
КонецПроцедуры
// Новые настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Перехват - Соответствие Из Произвольный
// * ТипыПерехватываемыхОбъектов - Соответствие Из Тип
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
Функция НовыеНастройки()
Настройки = Новый Структура;
Настройки.Вставить("Метод");
Настройки.Вставить("Реакция");
Настройки.Вставить("Перехват", Новый Соответствие);
Настройки.Вставить("ТипыПерехватываемыхОбъектов", Новый Соответствие);
Настройки.Вставить("Режим", "НеУстановлен");
Настройки.Вставить("Статистика", Новый Структура("Вызовы", Новый Соответствие));
Настройки.Вставить("ПараметрыОбучения", Неопределено);
Настройки.Вставить("ПараметрыПроверки", Неопределено);
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Настройки, Истина);
Возврат Настройки;
КонецПроцедуры
КонецФункции
Процедура ОчиститьНастройки() Экспорт
@ -641,6 +692,35 @@
КонецФункции
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Функция СтатистикаВызововПоМенеджеру(Вызовы, Менеджер, ИмяМетода)
СтатистикаВызововМетода = Новый Массив();
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
Если Описание = Неопределено Тогда
Возврат СтатистикаВызововМетода;
КонецЕсли;
Если Описание.ОписаниеТипа.Ссылочный Тогда
ТипОбъекта = Тип(СтрШаблон("%1Объект.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
Иначе
ТипОбъекта = Тип(СтрШаблон("%НаборЗаписей.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
КонецЕсли;
Для Каждого Элемент Из Вызовы Цикл
ПодходящийЭлемент = ТипЗнч(Элемент.Ключ) = ТипОбъекта
И Элемент.Значение.Свойство(ИмяМетода);
Если ПодходящийЭлемент Тогда
ЮТОбщий.ДополнитьМассив(СтатистикаВызововМетода, Элемент.Значение[ИмяМетода]);
КонецЕсли;
КонецЦикла;
Возврат СтатистикаВызововМетода;
КонецФункции
#КонецЕсли
#КонецОбласти
#КонецОбласти

View File

@ -110,6 +110,16 @@
КонецФункции
Функция ЭтоТипМенеджера(ТипЗначения) Экспорт
// TODO придумать другой способ определения типа
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
СтрокаПоиска = ?(ЮТЛокальСлужебный.ЭтоАнглийскаяЛокальПлатформы(), " manager:", " менеджер:");
Возврат СтрНайти(ПредставлениеТипа, СтрокаПоиска) > 0;
КонецФункции
Функция ТипОбъектаСсылки(ТипСсылки) Экспорт
#Если ВебКлиент Тогда

View File

@ -215,10 +215,16 @@
.Наблюдать("ПередЗаписью")
.Прогон();
ЮТест.ОжидаетЧто(МокитоСлужебный.Настройки()) // Проверка сформированных настроек
.Свойство("Перехват").ИмеетСвойство(Справочники.Встречи)
.Свойство("ТипыПерехватываемыхОбъектов")
.ИмеетДлину(2);
Справочники.Встречи.СохранитьИзменения(ЮТОбщий.ЗначениеВМассиве(Запись));
Мокито.Проверить(Справочники.Встречи, "Проверка через менеджер")
.КоличествоВызовов("ЗаполнитьОбъект").Равно(1)
.КоличествоВызовов("ПередЗаписью").Равно(1)
;
Мокито.Проверить(Запись.Встреча, "Проверка через ссылку")
.КоличествоВызовов("ПередЗаписью").Равно(1)