1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-12-03 08:45:31 +02:00

Merge pull request #232 from bia-technologies/feature/mockito

Пачка доработок по Мокито
This commit is contained in:
Koryakin Aleksey 2023-12-12 04:34:59 +03:00 committed by GitHub
commit 65d0796c22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 876 additions and 230 deletions

View File

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

View File

@ -36,7 +36,7 @@
Функция Обучение(Объект, СброситьСтарыеНастройки = Истина) Экспорт
УстановитьПараметрыОбучения(Объект);
МокитоСлужебный.ЗарегистрироватьПерехватОбъекта(Объект, СброситьСтарыеНастройки);
МокитоСлужебный.ДобавитьНастройкуПерехватаВызововОбъекта(Объект, СброситьСтарыеНастройки);
Возврат МокитоОбучение;
@ -164,15 +164,22 @@
Процедура ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова)
Объект = ОбучаемыйОбъект();
ДанныеПерехвата = МокитоСлужебный.ДанныеПерехвата(Объект);
ПереданаСтруктураВызоваМетода = МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода);
Если ПереданаСтруктураВызоваМетода Тогда
Объект = ИмяМетода.Объект;
Иначе
Объект = ОбучаемыйОбъект();
КонецЕсли;
ДанныеПерехвата = МокитоСлужебный.НастройкиПерехватаОбъекта(Объект);
Если ДанныеПерехвата = Неопределено Тогда
Сообщение = СтрШаблон("Не найдены настройки перехвата для %1. Необходимо предварительно вызвать метод Мокито.Обучение(Объект)", Объект);
ВызватьИсключение Сообщение;
КонецЕсли;
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
Если ПереданаСтруктураВызоваМетода Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыВызова);
@ -186,9 +193,12 @@
Реакция = СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода);
Методы[СтруктураВызоваМетода.ИмяМетода].Реакции.Добавить(Реакция);
РеакцииМетода = Методы[СтруктураВызоваМетода.ИмяМетода].Реакции;
РеакцииМетода.Добавить(Реакция);
ПараметрыОбучения().РеакцияТекущегоВыражения = Реакция;
ПараметрыОбучения = ПараметрыОбучения();
ПараметрыОбучения.РеакцияТекущегоВыражения = Реакция;
ПараметрыОбучения.Реакции = РеакцииМетода;
КонецПроцедуры
@ -200,10 +210,18 @@
#Область Реакции
Функция ОписаниеУсловнойРеакции()
Возврат Новый Структура("УсловиеРеакции, Действие");
КонецФункции
Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода)
Условия = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Возврат Новый Структура("УсловиеРеакции, Действие", Условия, Неопределено);
ОписаниеУсловнойРеакции = ОписаниеУсловнойРеакции();
ОписаниеУсловнойРеакции.УсловиеРеакции = Условия;
Возврат ОписаниеУсловнойРеакции;
КонецФункции
@ -213,33 +231,38 @@
Функция ОбучаемыйОбъект()
ПараметрыОбучения = ПараметрыОбучения();
Возврат ПараметрыОбучения.ОбучаемыйОбъект;
Возврат ПараметрыОбучения().ОбучаемыйОбъект;
КонецФункции
Функция ПараметрыОбучения()
Параметры = МокитоСлужебный.Настройки().ПараметрыОбучения;
Возврат Параметры;
Возврат МокитоСлужебный.Настройки().ПараметрыОбучения;
КонецФункции
Процедура УстановитьПараметрыОбучения(Объект)
ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения", Объект, Неопределено);
ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения, Реакции", Объект, Неопределено);
МокитоСлужебный.Настройки().ПараметрыОбучения = ПараметрыОбучения;
КонецПроцедуры
Процедура ЗарегистрироватьРеакцию(Действие)
Параметры = ПараметрыОбучения();
Действие.Вставить("Обработано", Ложь);
ПараметрыОбучения().РеакцияТекущегоВыражения.Действие = Действие;
Если Параметры.РеакцияТекущегоВыражения.Действие = Неопределено Тогда
Параметры.РеакцияТекущегоВыражения.Действие = Действие;
Иначе
НоваяРеакция = ОписаниеУсловнойРеакции();
ЗаполнитьЗначенияСвойств(НоваяРеакция, Параметры.РеакцияТекущегоВыражения);
НоваяРеакция.Действие = Действие;
Параметры.РеакцияТекущегоВыражения = НоваяРеакция;
Параметры.Реакции.Добавить(НоваяРеакция);
КонецЕсли;
КонецПроцедуры

View File

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

View File

@ -20,7 +20,9 @@
Функция Включен() Экспорт
Возврат ЮТКонтекст.ДанныеКонтекста() <> Неопределено;
ДанныеКонтекста = ЮТКонтекст.ДанныеКонтекста();
Настройки = Неопределено;
Возврат ДанныеКонтекста <> Неопределено И ДанныеКонтекста.Свойство(КлючНастроек(), Настройки) И Настройки <> Неопределено;
КонецФункции
@ -35,19 +37,10 @@
// Настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Настройки - Строка
// * Перехват - Строка
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
// см. НовыеНастройки
Функция Настройки() Экспорт
Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек());
Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек());
Если Настройки = Неопределено Тогда
ВызватьИсключение "Что-то пошло не так, настройки Мокито не инициализированы";
@ -94,7 +87,11 @@
Настройки = Настройки();
ПараметрыПерехвата = ДанныеПерехвата(Объект);
Если НЕ ЗначениеЗаполнено(Настройки.Перехват) Или Настройки.ТипыПерехватываемыхОбъектов[ТипЗнч(Объект)] = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ПараметрыПерехвата = ДанныеПерехвата(Объект, Настройки);
Если ПараметрыПерехвата = Неопределено Тогда
Возврат Неопределено;
@ -235,16 +232,32 @@
КонецФункции
Функция НастройкиПерехватаОбъекта(Объект) Экспорт
ПараметрыПерехвата = ПараметрыПерехвата();
Возврат ПараметрыПерехвата[Объект];
КонецФункции
// Данные перехвата.
//
// Параметры:
// Объект - Произвольный
// Настройки - см. НовыеНастройки
//
// Возвращаемое значение:
// см. МокитоСлужебный.ОписаниеПараметровПерехватаОбъекта
Функция ДанныеПерехвата(Объект) Экспорт
// см. ОписаниеПараметровПерехватаОбъекта
Функция ДанныеПерехвата(Объект, Настройки = Неопределено) Экспорт
ПараметрыПерехвата = ПараметрыПерехвата();
Если Настройки = Неопределено Тогда
ПараметрыПерехвата = ПараметрыПерехвата();
Иначе
ПараметрыПерехвата = Настройки.Перехват;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ПараметрыПерехвата) Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Объект) = Тип("Структура") Тогда
Ключ = Объект.Объект;
@ -253,17 +266,26 @@
КонецЕсли;
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ];
ТипЗначения = ТипЗнч(Ключ);
Если ПараметрыПерехватаОбъекта = Неопределено И ЭтоОбъект(Ключ) Тогда
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ.Ссылка];
Если ПараметрыПерехватаОбъекта = Неопределено Тогда
Если ПараметрыПерехватаОбъекта = Неопределено Тогда
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъектаОбработкиОтчета(ТипЗначения) Или ЮТТипыДанныхСлужебный.ЭтоТипНабораЗаписей(ТипЗначения) Тогда
ПолноеИмя = СтрРазделить(Ключ.Метаданные().ПолноеИмя(), ".");
Менеджер = Новый(СтрШаблон("%1Менеджер.%2", ПолноеИмя[0], ПолноеИмя[1]));
Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Менеджер];
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ.Ссылка];
Если ПараметрыПерехватаОбъекта = Неопределено Тогда
Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Менеджер];
КонецЕсли;
КонецЕсли;
КонецЕсли;
@ -272,20 +294,50 @@
КонецФункции
Процедура ЗарегистрироватьПерехватОбъекта(Знач Объект, СброситьСтарыеНастройки = Истина) Экспорт
Процедура ДобавитьНастройкуПерехватаВызововОбъекта(Знач Объект, СброситьСтарыеНастройки = Истина) Экспорт
Если ЭтоОбъект(Объект) Тогда
Объект = Объект.Ссылка;
Настройки = Настройки();
Если СброситьСтарыеНастройки ИЛИ Настройки.Перехват[Объект] = Неопределено Тогда
Настройки.Перехват.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
КонецЕсли;
ПараметрыПерехвата = ПараметрыПерехвата();
ТипОбъекта = ТипЗнч(Объект);
Если СброситьСтарыеНастройки ИЛИ ПараметрыПерехвата[Объект] = Неопределено Тогда
ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
Если ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипОбъекта) Тогда
ТипОбъекта = ЮТТипыДанныхСлужебный.ТипОбъектаСсылки(ТипОбъекта);
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипМенеджера(ТипОбъекта) Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(ТипОбъекта);
Если Описание <> Неопределено Тогда
Если Описание.ОписаниеТипа.Ссылочный Или Описание.ОписаниеТипа.ОбработкаОтчет Тогда
ТипОбъекта = Тип(СтрШаблон("%1Объект.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
ИначеЕсли Описание.ОписаниеТипа.Регистр Тогда
ТипОбъекта = Тип(СтрШаблон("%1НаборЗаписей.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
КонецЕсли;
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
КонецЕсли;
#КонецЕсли
КонецЕсли;
КонецПроцедуры
// Описание параметров перехвата объекта.
//
// Параметры:
// * Объект - Произвольный - Объект
//
// Возвращаемое значение:
// Структура - Описание параметров перехвата объекта:
// * Объект - Произвольный
// * Методы - Структура -
Функция ОписаниеПараметровПерехватаОбъекта(Объект) Экспорт
Возврат Новый Структура("Объект, Методы", Объект, Новый Структура);
@ -298,17 +350,23 @@
Функция СтатистикаВызовов(Знач Объект, ИмяМетода) Экспорт
Если ЭтоОбъект(Объект) Тогда
Объект = Объект.Ссылка;
Вызовы = Настройки().Статистика.Вызовы;
СтатистикаВызововМетода = Новый Массив();
Статистика = Вызовы[Объект];
ТипОбъекта = ТипЗнч(Объект);
Если Статистика <> Неопределено И Статистика.Свойство(ИмяМетода) Тогда
СтатистикаВызововМетода = Статистика[ИмяМетода];
ИначеЕсли Статистика = Неопределено И ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипОбъекта) Тогда
СтатистикаВызововМетода = СтатистикаВызововПоСсылке(Вызовы, Объект, ИмяМетода);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипМенеджера(ТипОбъекта) Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
СтатистикаВызововМетода = СтатистикаВызововПоМенеджеру(Вызовы, Объект, ИмяМетода);
#КонецЕсли
КонецЕсли;
Статистика = Настройки().Статистика.Вызовы[Объект];
Если Статистика = Неопределено ИЛИ НЕ Статистика.Свойство(ИмяМетода) Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Статистика[ИмяМетода];
Возврат СтатистикаВызововМетода;
КонецФункции
@ -343,35 +401,6 @@
#Область ОбработкаВызовов
// Зарегистрировать вызов метода.
//
// Параметры:
// Настройки - см. ИнициализироватьНастройки
// ПараметрыПерехвата - см. ДанныеПерехвата
// СтруктураВызоваМетода - см. СтруктураВызоваМетода
Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода)
Объект = ПараметрыПерехвата.Объект;
ИмяМетода = СтруктураВызоваМетода.ИмяМетода;
Статистика = Настройки.Статистика.Вызовы[Объект];
Если Статистика = Неопределено Тогда
Статистика = Новый Структура;
Настройки.Статистика.Вызовы.Вставить(Объект, Статистика);
КонецЕсли;
Если НЕ Статистика.Свойство(ИмяМетода) Тогда
Статистика.Вставить(ИмяМетода, Новый Массив);
КонецЕсли;
Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода);
КонецПроцедуры
Функция ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение)
Если НЕ ПараметрыПерехвата.Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда
@ -495,20 +524,39 @@
Процедура ИнициализироватьНастройки() Экспорт
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), НовыеНастройки(), Истина);
КонецПроцедуры
// Новые настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Перехват - Соответствие Из Произвольный
// * ТипыПерехватываемыхОбъектов - Соответствие Из Тип
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
Функция НовыеНастройки()
Настройки = Новый Структура;
Настройки.Вставить("Метод");
Настройки.Вставить("Реакция");
Настройки.Вставить("Настройки");
Настройки.Вставить("Перехват", Новый Соответствие);
Настройки.Вставить("ТипыПерехватываемыхОбъектов", Новый Соответствие);
Настройки.Вставить("Режим", "НеУстановлен");
Настройки.Вставить("Статистика", Новый Структура("Вызовы", Новый Соответствие));
Настройки.Вставить("ПараметрыОбучения", Неопределено);
Настройки.Вставить("ПараметрыПроверки", Неопределено);
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Настройки, Истина);
Возврат Настройки;
КонецПроцедуры
КонецФункции
Процедура ОчиститьНастройки() Экспорт
@ -539,39 +587,6 @@
#КонецОбласти
Функция ЭтоСсылка(Значение) Экспорт
Если Значение <> Неопределено Тогда
ТипыСсылок = ЮТОбщий.ОписаниеТиповЛюбаяСсылка();
Результат = ТипыСсылок.СодержитТип(ТипЗнч(Значение));
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭтоОбъект(Значение) Экспорт
Если Значение <> Неопределено И ЮТОбщий.ПеременнаяСодержитСвойство(Значение, "Ссылка") Тогда
Возврат ЭтоСсылка(Значение.Ссылка);
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция УсловиеИзПараметров(Параметры) Экспорт
Если Параметры = Неопределено Тогда
@ -608,4 +623,84 @@
КонецФункции
#Область Статистика
// Зарегистрировать вызов метода.
//
// Параметры:
// Настройки - см. ИнициализироватьНастройки
// ПараметрыПерехвата - см. ДанныеПерехвата
// СтруктураВызоваМетода - см. СтруктураВызоваМетода
Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода)
Объект = СтруктураВызоваМетода.Объект;
ИмяМетода = СтруктураВызоваМетода.ИмяМетода;
Статистика = Настройки.Статистика.Вызовы[Объект];
Если Статистика = Неопределено Тогда
Статистика = Новый Структура;
Настройки.Статистика.Вызовы.Вставить(Объект, Статистика);
КонецЕсли;
Если НЕ Статистика.Свойство(ИмяМетода) Тогда
Статистика.Вставить(ИмяМетода, Новый Массив);
КонецЕсли;
Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода);
КонецПроцедуры
Функция СтатистикаВызововПоСсылке(Вызовы, Ссылка, ИмяМетода)
СтатистикаВызововМетода = Новый Массив();
ТипОбъекта = ЮТТипыДанныхСлужебный.ТипОбъектаСсылки(ТипЗнч(Ссылка));
Для Каждого Элемент Из Вызовы Цикл
ПодходящийЭлемент = ТипЗнч(Элемент.Ключ) = ТипОбъекта
И Элемент.Ключ.Ссылка = Ссылка
И Элемент.Значение.Свойство(ИмяМетода);
Если ПодходящийЭлемент Тогда
ЮТОбщий.ДополнитьМассив(СтатистикаВызововМетода, Элемент.Значение[ИмяМетода]);
КонецЕсли;
КонецЦикла;
Возврат СтатистикаВызововМетода;
КонецФункции
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Функция СтатистикаВызововПоМенеджеру(Вызовы, Менеджер, ИмяМетода)
СтатистикаВызововМетода = Новый Массив();
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
Если Описание = Неопределено Тогда
Возврат СтатистикаВызововМетода;
КонецЕсли;
Если Описание.ОписаниеТипа.Ссылочный Или Описание.ОписаниеТипа.ОбработкаОтчет Тогда
ТипОбъекта = Тип(СтрШаблон("%1Объект.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
ИначеЕсли Описание.ОписаниеТипа.Регистр Тогда
ТипОбъекта = Тип(СтрШаблон("%1НаборЗаписей.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
КонецЕсли;
Для Каждого Элемент Из Вызовы Цикл
ПодходящийЭлемент = ТипЗнч(Элемент.Ключ) = ТипОбъекта
И Элемент.Значение.Свойство(ИмяМетода);
Если ПодходящийЭлемент Тогда
ЮТОбщий.ДополнитьМассив(СтатистикаВызововМетода, Элемент.Значение[ИмяМетода]);
КонецЕсли;
КонецЦикла;
Возврат СтатистикаВызововМетода;
КонецФункции
#КонецЕсли
#КонецОбласти
#КонецОбласти

View File

@ -128,7 +128,9 @@
Возврат ОписаниеОбъект;
КонецЕсли;
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
Если ОписаниеТипа.СтандартныеРеквизиты Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
КонецЕсли;
Если ОписаниеТипа.Измерения Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты, Истина);
@ -173,6 +175,9 @@
// * Конструктор - Строка
// * Группы - Булево
// * Ссылочный - Булево
// * Регистр - Булево
// * ОбработкаОтчет - Булево
// * СтандартныеРеквизиты - Булево
// * Реквизиты - Булево
// * Измерения - Булево
// * Ресурсы - Булево
@ -188,7 +193,12 @@
ЧастиИмени = СтрРазделить(ПолноеИмя, ".");
Типы = ЮТМетаданные.ТипыМетаданных();
Возврат Типы[ЧастиИмени[0]];
Если Типы.Свойство(ЧастиИмени[0]) Тогда
Возврат Типы[ЧастиИмени[0]];
Иначе
Сообщение = СтрШаблон("Получение описания для '%1' не поддерживается, либо не реализовано", ЧастиИмени[0]);
ВызватьИсключение Сообщение;
КонецЕсли;
КонецФункции
@ -212,6 +222,9 @@
Описание.Вставить("Ресурсы", Запись.Ресурсы = "+");
Описание.Вставить("РеквизитыАдресации", Запись.РеквизитыАдресации = "+");
Описание.Вставить("ТабличныеЧасти", Запись.ТабличныеЧасти = "+");
Описание.Вставить("СтандартныеРеквизиты", Запись.СтандартныеРеквизиты = "+");
Описание.Вставить("ОбработкаОтчет", Запись.Имя = "Обработка" ИЛИ Запись.Имя = "Отчет");
Описание.Вставить("Регистр", СтрНачинаетсяС(Запись.Имя, "Регистр"));
ТипыМетаданных.Вставить(Описание.Имя, Описание);
ТипыМетаданных.Вставить(Описание.ИмяКоллекции, Описание);

View File

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

View File

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

View File

@ -23,14 +23,7 @@
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
#Иначе
//@skip-check Undefined variable
ТипXML = СериализаторXDTO.XMLТип(Тип);
Если ТипXML = Неопределено Тогда
Возврат Строка(Тип);
Иначе
Возврат ТипXML.ИмяТипа;
КонецЕсли;
Возврат ИдентификаторТипа(Тип);
#КонецЕсли
КонецФункции
@ -39,18 +32,20 @@
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
#ИначеЕсли Сервер Тогда
Возврат ЗначениеВСтрокуВнутр(Тип); // Не все серверные типы сериализуются через СериализаторXDTO
#Иначе
Попытка
Запись = Новый ЗаписьJSON();
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(Запись, Тип);
Возврат Запись.Закрыть();
Исключение
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки(СтрШаблон("Не удалось определить идентификатор типа для `%1`", Тип));
ВызватьИсключение;
КонецПопытки;
ЮТПроверкиСлужебный.ПроверитьТипПараметра(Тип, Тип("Тип"), "ЮТТипыДанныхСлужебный.ИдентификаторТипа", "Тип");
Если Тип = Тип("Дата") Тогда
ИдентификаторТипа = "date";
ИначеЕсли Тип = Тип("Число") Тогда
ИдентификаторТипа = "number";
Иначе
//@skip-check Undefined variable
ИмяТипаСПространствомИмен = СериализаторXDTO.ЗаписатьXDTO(Тип).ЛексическоеЗначение;
ИдентификаторТипа = СтрРазделить(ИмяТипаСПространствомИмен, "}")[1];
КонецЕсли;
Возврат ИдентификаторТипа;
#КонецЕсли
КонецФункции
@ -59,30 +54,8 @@
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
#ИначеЕсли Сервер Тогда
Если СтрНачинаетсяС(ИдентификаторТипа, "{") Тогда
Возврат ЗначениеИзСтрокиВнутр(ИдентификаторТипа);
КонецЕсли;
#КонецЕсли
Возврат ТипПоПредставлению(ИдентификаторТипа);
КонецФункции
Функция ТипПоПредставлению(ПредставлениеТипа) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ТипПоПредставлению");
#Иначе
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(ПредставлениеТипа);
Результат = СериализаторXDTO.ПрочитатьJSON(Чтение, Тип("Тип"));
Если Результат = Неопределено Тогда
ВызватьИсключение СтрШаблон("Не удалось определить тип по представлению `%1`", ПредставлениеТипа);
КонецЕсли;
Возврат Результат;
Возврат Тип(ИдентификаторТипа);
#КонецЕсли
КонецФункции
@ -93,12 +66,51 @@
КонецФункции
Функция ЭтоМенеджерЗаписи(Тип) Экспорт
Функция ЭтоМенеджерЗаписи(ТипЗначения) Экспорт
ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(Тип);
СтрокаПоиска = ?(ЮТЛокальСлужебный.ЭтоАнглийскаяЛокальПлатформы(), "Record manager:", "менеджер записи:");
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "RecordManager.") > 0;
Возврат СтрНайти(ПредставлениеТипа, СтрокаПоиска);
КонецФункции
Функция ЭтоТипОбъекта(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "Object.") > 0;
КонецФункции
Функция ЭтоТипНабораЗаписей(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "RecordSet.") > 0;
КонецФункции
Функция ЭтоТипОбъектаОбработкиОтчета(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНачинаетсяС(ПредставлениеТипа, "DataProcessorObject.") Или СтрНачинаетсяС(ПредставлениеТипа, "ReportObject.");
КонецФункции
Функция ЭтоТипМенеджера(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "Manager.") > 0;
КонецФункции
Функция ТипОбъектаСсылки(ТипСсылки) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ТипОбъектаСсылки");
#Иначе
ТипXML = СериализаторXDTO.XMLТип(ТипСсылки);
ИмяТипа = СтрЗаменить(ТипXML.ИмяТипа, "Ref.", "Object.");
Возврат СериализаторXDTO.ИзXMLТипа(ИмяТипа, ТипXML.URIПространстваИмен);
#КонецЕсли
КонецФункции

View File

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

View File

@ -1,17 +1,19 @@
# Описание свойств метаданных
| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти |
|------------------------|-------------------------|-----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------|
| Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + |
| Документ | Документы | СоздатьДокумент | | + | + | | | | + |
| ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + |
| ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + |
| ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + |
| ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + |
| РегистрСведений | РегистрыСведений | СоздатьМенеджерЗаписи | | | + | + | + | | |
| РегистрНакопления | РегистрыНакопления | | | | + | + | + | | |
| РегистрБухгалтерии | РегистрыБухгалтерии | | | | + | + | + | | |
| РегистрРасчета | РегистрыРасчета | | | | + | + | + | | |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + |
| Перечисление | Перечисления | | | + | | | | | |
| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти | СтандартныеРеквизиты |
|------------------------|-------------------------|-----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------|----------------------|
| Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + | + |
| Документ | Документы | СоздатьДокумент | | + | + | | | | + | + |
| ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + | + |
| ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + | + |
| ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + | + |
| ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + | + |
| РегистрСведений | РегистрыСведений | СоздатьМенеджерЗаписи | | | + | + | + | | | + |
| РегистрНакопления | РегистрыНакопления | | | | + | + | + | | | + |
| РегистрБухгалтерии | РегистрыБухгалтерии | | | | + | + | + | | | + |
| РегистрРасчета | РегистрыРасчета | | | | + | + | + | | | + |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + | + |
| Перечисление | Перечисления | | | + | | | | | | + |
| Отчет | Отчеты | | | | + | | | | + | |
| Обработка | Обработки | | | | + | | | | + | |

View File

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

View File

@ -23,7 +23,7 @@
<name>PredefinedDataName</name>
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -33,7 +33,7 @@
<name>Predefined</name>
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -43,7 +43,7 @@
<name>Ref</name>
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -53,7 +53,7 @@
<name>DeletionMark</name>
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -63,7 +63,7 @@
<name>IsFolder</name>
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -75,7 +75,7 @@
<fillFromFillingValue>true</fillFromFillingValue>
<fillValue xsi:type="core:UndefinedValue"/>
<fillChecking>ShowError</fillChecking>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -86,7 +86,7 @@
<comment></comment>
<fillFromFillingValue>true</fillFromFillingValue>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -101,7 +101,7 @@
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fillChecking>ShowError</fillChecking>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
@ -111,14 +111,14 @@
<name>Code</name>
<comment></comment>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<mask></mask>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
</standardAttributes>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<fullTextSearch>DontUse</fullTextSearch>
<dataHistory>Use</dataHistory>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
@ -129,6 +129,15 @@
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<predefined>
<items id="bf9313f1-f2b0-4fb4-a97a-aabef9e25a2e">
<name>ПустойПользователь</name>
<description>Пустой пользователь</description>
<code xsi:type="core:StringValue">
<value>0000000000000000000000001</value>
</code>
</items>
</predefined>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
<defaultObjectForm>Catalog.Пользователи.Form.ФормаЭлемента</defaultObjectForm>

View File

@ -0,0 +1,9 @@
Процедура ЗаполненоКорректно(НаборЗаписей) Экспорт
Для Каждого Строка Из НаборЗаписей Цикл
Если Строка.Цена < 0 Тогда
ВызватьИсключение "Цена товара не может быть отрицательной";
КонецЕсли;
КонецЦикла;
КонецПроцедуры

View File

@ -0,0 +1,19 @@
#Область ОбработчикиСобытий
Процедура ПередЗаписью(Отказ, Замещение)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
РегистрыСведений.ЦеныТоваров.ЗаполненоКорректно(ЭтотОбъект);
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
РегистрыСведений.ЦеныТоваров.ЗаполненоКорректно(ЭтотОбъект);
КонецПроцедуры
#КонецОбласти

View File

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

View File

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

View File

@ -20,14 +20,20 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
ЮТТесты.ВТранзакции()
.ДобавитьТест("Обучение")
.ДобавитьТест("Обучение_ЦепочкаВызовов")
.ДобавитьТест("Проверить")
.ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь)
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции()
.ДобавитьТест("ОшибкаПодбораРеакции")
.ДобавитьТест("ИспользованиеПредикатов")
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов")
.ДобавитьСерверныйТест("МокированиеЧерезМенеджер")
.ДобавитьСерверныйТест("МокированиеЧерезСсылку")
.ДобавитьСерверныйТест("МокированиеЧерезОбъект")
.ДобавитьСерверныйТест("МокированиеМетодовРегистра")
.ДобавитьСерверныйТест("МокированиеМетодовОбработки")
.ДобавитьТест("МокированиеЦепочкиВызовов")
;
КонецПроцедуры
@ -161,7 +167,7 @@
.Когда(СправочникОбъект.ПечатнаяФормаШтрихкода(Неопределено)).Вернуть(Результат)
.Прогон();
ЮТест.ОжидаетЧто(Справочник.ПолучитьОбъект().ПечатнаяФормаШтрихкода(Неопределено), Описание)
ЮТест.ОжидаетЧто(СправочникОбъект.ПечатнаяФормаШтрихкода(Неопределено), Описание)
.Равно(Результат);
Мокито.Проверить(Справочник).КоличествоВызовов("ПечатнаяФормаШтрихкода").Заполнено(Описание);
@ -197,6 +203,171 @@
.Равно(Результат);
КонецПроцедуры
Процедура МокированиеЧерезМенеджер() Экспорт
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ОбменДаннымиЗагрузка = Истина;
Запись = Новый Структура("Встреча, Начало, Конец, Владелец");
Запись.Встреча = ЮТест.Данные().СоздатьЭлемент(Справочники.Встречи, , , ПараметрыЗаписи);
Мокито.Обучение(Справочники.Встречи)
.Наблюдать("СохранитьИзменения")
.Наблюдать("ЗаполнитьОбъект")
.Наблюдать("ПередЗаписью")
.Прогон();
ЮТест.ОжидаетЧто(МокитоСлужебный.Настройки()) // Проверка сформированных настроек
.Свойство("Перехват").ИмеетСвойство(Справочники.Встречи)
.Свойство("ТипыПерехватываемыхОбъектов")
.ИмеетДлину(2);
Справочники.Встречи.СохранитьИзменения(ЮТОбщий.ЗначениеВМассиве(Запись));
Мокито.Проверить(Запись.Встреча, "Проверка через ссылку")
.КоличествоВызовов("ПередЗаписью").Равно(1)
;
Мокито.Проверить(Справочники.Встречи, "Проверка через менеджер")
.КоличествоВызовов("ЗаполнитьОбъект").Равно(1)
.КоличествоВызовов("ПередЗаписью").Равно(1)
;
КонецПроцедуры
Процедура МокированиеЧерезСсылку() Экспорт
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ОбменДаннымиЗагрузка = Истина;
Встреча = ЮТест.Данные().КонструкторОбъекта(Справочники.Встречи)
.ФикцияОбязательныхПолей()
.Записать();
Мокито.Обучение(Встреча)
.Когда("УказанКорректныйПериод")
.Вернуть(Истина)
.Когда("УказанКорректныйПериод")
.Вернуть(Ложь)
.Прогон();
Объект = Встреча.ПолучитьОбъект();
ЮТест.ОжидаетЧто(Объект.ПроверитьЗаполнение(), "Первая проверка")
.ЭтоИстина()
.Что(Объект.ПроверитьЗаполнение(), "Вторая проверка")
.ЭтоЛожь()
;
Мокито.Проверить(Встреча)
.КоличествоВызовов("УказанКорректныйПериод").Равно(2)
;
КонецПроцедуры
Процедура МокированиеЧерезОбъект() Экспорт
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ОбменДаннымиЗагрузка = Истина;
Встреча = ЮТест.Данные().КонструкторОбъекта(Справочники.Встречи)
.ФикцияОбязательныхПолей()
.Записать();
Объект1 = Встреча.ПолучитьОбъект();
Объект2 = Встреча.ПолучитьОбъект();
Мокито.Обучение(Объект1)
.Когда("УказанКорректныйПериод")
.Вернуть(Истина)
.Когда("УказанКорректныйПериод")
.Вернуть(Ложь)
.Обучение(Объект2)
.Когда("УказанКорректныйПериод")
.Вернуть(Ложь)
.Прогон();
ЮТест.ОжидаетЧто(Объект1.ПроверитьЗаполнение(), "Первая проверка")
.ЭтоИстина()
.Что(Объект1.ПроверитьЗаполнение(), "Вторая проверка")
.ЭтоЛожь()
.Что(Объект2.ПроверитьЗаполнение(), "Проверка второго объекта")
.ЭтоЛожь()
;
Мокито.Проверить(Объект1)
.КоличествоВызовов("УказанКорректныйПериод").Равно(2);
Мокито.Проверить(Объект2)
.КоличествоВызовов("УказанКорректныйПериод").Равно(1);
КонецПроцедуры
Процедура МокированиеМетодовРегистра() Экспорт
Мокито.Обучение(РегистрыСведений.ЦеныТоваров)
.Наблюдать("ОбработкаПроверкиЗаполнения")
.Когда("ЗаполненоКорректно")
.Пропустить()
.Когда("ЗаполненоКорректно")
.ВыброситьИсключение("Цена товара не может быть отрицательной")
.Прогон()
;
НаборЗаписей = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей();
ЮТест.ОжидаетЧто(НаборЗаписей)
.Метод("ПроверитьЗаполнение")
.НеВыбрасываетИсключение()
.ВыбрасываетИсключение("Цена товара не может быть отрицательной");
Мокито.Проверить(РегистрыСведений.ЦеныТоваров, "Через менеджер")
.КоличествоВызовов("ЗаполненоКорректно").Равно(2)
.КоличествоВызовов("ОбработкаПроверкиЗаполнения").Равно(2);
Мокито.Проверить(НаборЗаписей, "Через набор")
.КоличествоВызовов("ЗаполненоКорректно").Равно(0)
.КоличествоВызовов("ОбработкаПроверкиЗаполнения").Равно(2);
// Через набор записей
Мокито.Сбросить();
НаборЗаписей2 = РегистрыСведений.ЦеныТоваров.СоздатьНаборЗаписей();
Мокито.Обучение(НаборЗаписей)
.Наблюдать("ПередЗаписью")
.Прогон();
НаборЗаписей.Записать();
НаборЗаписей2.Записать();
Мокито.Проверить(НаборЗаписей, "Обучение через набор, проверка первого набора")
.КоличествоВызовов("ПередЗаписью").Равно(1);
Мокито.Проверить(НаборЗаписей2, "Обучение через набор, проверка второго набора")
.КоличествоВызовов("ПередЗаписью").Равно(0);
Мокито.Проверить(РегистрыСведений.ЦеныТоваров, "Обучение через набор, проверка через менеджер")
.КоличествоВызовов("ПередЗаписью").Равно(1);
КонецПроцедуры
Процедура МокированиеМетодовОбработки() Экспорт
Обработка = Обработки.ПроведениеДокументов.Создать();
Обработка.ЗаполнитьСписок();
ЮТест.ОжидаетЧто(Обработка.СписокДокументов)
.Заполнено();
Мокито.Обучение(Обработки.ПроведениеДокументов)
.Когда("ЗаполнитьСписок").Пропустить()
.Прогон();
Обработка = Обработки.ПроведениеДокументов.Создать();
Обработка.ЗаполнитьСписок();
ЮТест.ОжидаетЧто(Обработка.СписокДокументов)
.НеЗаполнено("Не сработал перехват события настроенного через менеджер");
Мокито.Проверить(Обработка)
.КоличествоВызовов("ЗаполнитьСписок").Равно(1);
Мокито.Проверить(Обработки.ПроведениеДокументов)
.КоличествоВызовов("ЗаполнитьСписок").Равно(1);
КонецПроцедуры
#КонецЕсли
Процедура Прогон_НакоплениеСтатистики(НакоплениеСтатистики) Экспорт
@ -303,6 +474,25 @@
.КоличествоВызовов("ВыполнитьЗапрос", Мокито.МассивПараметров(ЛюбойПараметр, Новый Структура("Флаг", 2))).Равно(1)
КонецПроцедуры
Процедура МокированиеЦепочкиВызовов() Экспорт
Мокито.Обучение(Интеграция)
.Когда("ВыполнитьЗапрос")
.Вернуть(1)
.Вернуть(2)
.Вернуть(3)
.Прогон();
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(""))
.Равно(1);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(""))
.Равно(2);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(""))
.Равно(3);
ЮТест.ОжидаетЧто(Интеграция.ВыполнитьЗапрос(""))
.Равно(3);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -22,6 +22,7 @@
ЮТТесты
.ДобавитьТест("ВыброситьИсключение")
.ДобавитьСерверныйТест("ФормированиеТипыПерехватываемыхОбъектов")
;
КонецПроцедуры
@ -45,4 +46,39 @@
КонецПроцедуры
#Если Сервер Тогда
Процедура ФормированиеТипыПерехватываемыхОбъектов() Экспорт
Мокито.Обучение(Обработки.АдминистративныйСервис);
ЮТест.ОжидаетЧто(МокитоСлужебный.Настройки(), "Обработка менеджер") // Проверка сформированных настроек
.Свойство("Перехват").ИмеетСвойство(Обработки.АдминистративныйСервис)
.Свойство("ТипыПерехватываемыхОбъектов")
.ИмеетДлину(2)
.ИмеетСвойство(Тип("ОбработкаМенеджер.АдминистративныйСервис"))
.ИмеетСвойство(Тип("ОбработкаОбъект.АдминистративныйСервис"));
Мокито.Сбросить();
Мокито.Обучение(Справочники.Банки.ПустаяСсылка());
ЮТест.ОжидаетЧто(МокитоСлужебный.Настройки(), "Ссылка") // Проверка сформированных настроек
.Свойство("Перехват").ИмеетСвойство(Справочники.Банки.ПустаяСсылка())
.Свойство("ТипыПерехватываемыхОбъектов")
.ИмеетДлину(2)
.ИмеетСвойство(Тип("СправочникСсылка.Банки"))
.ИмеетСвойство(Тип("СправочникОбъект.Банки"));
Мокито.Сбросить();
Мокито.Обучение(РегистрыНакопления.Взаиморасчеты);
ЮТест.ОжидаетЧто(МокитоСлужебный.Настройки(), "Регистр") // Проверка сформированных настроек
.Свойство("Перехват").ИмеетСвойство(РегистрыНакопления.Взаиморасчеты)
.Свойство("ТипыПерехватываемыхОбъектов")
.ИмеетДлину(2)
.ИмеетСвойство(Тип("РегистрНакопленияНаборЗаписей.Взаиморасчеты"))
.ИмеетСвойство(Тип("РегистрНакопленияМенеджер.Взаиморасчеты"));
КонецПроцедуры
#КонецЕсли
#КонецОбласти

View File

@ -0,0 +1,48 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("ДанныеПерехвата")
;
КонецПроцедуры
Процедура ДанныеПерехвата() Экспорт
Мокито.Обучение(Справочники.Встречи)
.Наблюдать("ПередЗаписью");
ДанныеПерехвата = МокитоСлужебный.ДанныеПерехвата(Справочники.Встречи.СоздатьЭлемент());
ЮТест.ОжидаетЧто(ДанныеПерехвата)
.Заполнено()
.Свойство("Объект").Равно(Справочники.Встречи)
.Свойство("Методы").ИмеетСвойство("ПередЗаписью")
;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9c6cbdc6-eb05-47c3-9aac-0f5ec59328b5">
<name>ОМ_МокитоСлужебный</name>
<synonym>
<key>ru</key>
<value>О м мокито служебный</value>
</synonym>
<server>true</server>
</mdclass:CommonModule>

View File

@ -23,6 +23,7 @@
ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("ЗаполнитьСправочник")
.ДобавитьТест("ЗаполнитьДокумент")
.ДобавитьТест("СоздатьЗаписьРегистраСведений")
.ДобавитьТест("Фикция")
.ДобавитьТест("Фикция_Типизированная")
.ДобавитьТест("ФикцияОбязательныхПолей")
@ -122,6 +123,20 @@
КонецПроцедуры
Процедура СоздатьЗаписьРегистраСведений() Экспорт
Результат = ЮТест.Данные().КонструкторОбъекта("РегистрыСведений.КурсыВалют")
.Фикция("Валюта")
.Фикция("Курс")
.Установить("Период", ТекущаяДата())
.Записать();
ЮТест.ОжидаетЧто(Результат)
.ИмеетТип(Тип("РегистрСведенийКлючЗаписи.КурсыВалют"))
.Заполнено();
КонецПроцедуры
Процедура Фикция() Экспорт
Поставщик = Ютест.Данные().СоздатьЭлемент("Справочники.Контрагенты");

View File

@ -39,7 +39,25 @@
.ДобавитьТест("ЭтоКоллекцияПримитивныхТипов")
.СПараметрами(ЮТОбщий.ЗначениеВМассиве(Тип("Строка"), Тип("Дата")), Истина)
.СПараметрами(ЮТОбщий.ЗначениеВМассиве(Тип("Строка"), Тип("Дата"), Тип("ПеречислениеСсылка.PushУведомления")), Ложь)
.ДобавитьТест("ИдентификаторТипа")
.СПараметрами("Дата")
.СПараметрами("Строка")
.СПараметрами("Число")
.СПараметрами("Булево")
.СПараметрами("Неопределено")
.СПараметрами("Null")
.СПараметрами("УникальныйИдентификатор")
.СПараметрами("ВидДвиженияБухгалтерии")
.СПараметрами("HTTPЗапрос")
.СПараметрами("ТабличныйДокумент")
.СПараметрами("ХранилищеЗначения")
.СПараметрами("ПеречислениеСсылка.PushУведомления")
.ДобавитьСерверныйТест("ИдентификаторТипа")
.СПараметрами("СправочникМенеджер.Банки")
.СПараметрами("СхемаКомпоновкиДанных")
.СПараметрами("HTTPСервисЗапрос")
.СПараметрами("ОбъектXDTO")
.СПараметрами("ОбъектМетаданных")
;
КонецПроцедуры
@ -48,7 +66,6 @@
ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоСистемноеПеречисление(Тип))
.Равно(ОжидаемыйРезультат);
КонецПроцедуры
Процедура ТипыСистемныхПеречислений() Экспорт
@ -82,6 +99,18 @@
КонецПроцедуры
Процедура ИдентификаторТипа(ИмяТипа) Экспорт
Тип = Тип(ИмяТипа);
Результат = ЮТТипыДанныхСлужебный.ИдентификаторТипа(Тип(ИмяТипа));
ЮТест.ОжидаетЧто(Результат)
.Заполнено();
ЮТест.ОжидаетЧто(Тип(Результат))
.Равно(Тип);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -5,5 +5,7 @@
<key>ru</key>
<value>Типы данных служебный</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -93,7 +93,7 @@
Наборы = ЮТЧитатель.ЗагрузитьТесты(ПараметрыЗапуска);
ЮТест.ОжидаетЧто(Наборы, "Прочитанные наборы расширения tests")
.ИмеетДлину(23);
.ИмеетДлину(24);
КонецПроцедуры

View File

@ -28,6 +28,7 @@
<commonModules>CommonModule.Обр_ЮТHTTPСервисЗапрос</commonModules>
<commonModules>CommonModule.ОМ_Мокито</commonModules>
<commonModules>CommonModule.ОМ_МокитоОбучение</commonModules>
<commonModules>CommonModule.ОМ_МокитоСлужебный</commonModules>
<commonModules>CommonModule.ОМ_Общий</commonModules>
<commonModules>CommonModule.ОМ_ОшибкаЗагрузкиСценариев</commonModules>
<commonModules>CommonModule.ОМ_ЮТест</commonModules>
@ -54,4 +55,6 @@
<catalogs>Catalog.Встречи</catalogs>
<catalogs>Catalog.Товары</catalogs>
<documents>Document.ПриходТовара</documents>
<dataProcessors>DataProcessor.ПроведениеДокументов</dataProcessors>
<informationRegisters>InformationRegister.ЦеныТоваров</informationRegisters>
</mdclass:Configuration>

View File

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

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="b692ca7c-050c-4877-96cd-f4d80d5b76d2">
<producedTypes>
<objectType typeId="b29007c7-cc82-4f54-abf4-8d0d77299bdf" valueTypeId="d4153680-ac36-4513-b2e2-e6cef9372f29"/>
<managerType typeId="d1f7a204-67bf-48b1-b4b6-b7ce9ae2a924" valueTypeId="c67f0951-a8f6-40d5-9f98-184f3cb6fef1"/>
</producedTypes>
<name>ПроведениеДокументов</name>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:DataProcessorExtension">
<objectModule>Extended</objectModule>
</extension>
</mdclass:DataProcessor>

View File

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

View File

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

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:InformationRegister xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="67201e35-afd7-492c-a710-4a05305e1743">
<producedTypes>
<selectionType typeId="26b9331d-7726-4669-bb42-9d0f2f223c2e" valueTypeId="e9f7789b-d420-49aa-8b13-4f7aed559a6c"/>
<listType typeId="e3a39aa2-2011-4ebe-aa2e-9523ad811687" valueTypeId="c8a1cecf-9246-40de-af96-7bc9c47ba230"/>
<managerType typeId="7ca0d09a-e919-4883-947b-81bcd2d4f50b" valueTypeId="98f4bbbd-9e9d-4776-9be5-6caf9591d6db"/>
<recordSetType typeId="51c45869-9e3b-4b4c-be61-3e5bb46269dd" valueTypeId="10047383-6e4d-4678-b7bb-bb884301c50a"/>
<recordKeyType typeId="b9489145-7cee-4adc-bd2e-e821324b53ab" valueTypeId="0a1b4515-7e4e-4b5f-8485-cd2cbf541868"/>
<recordType typeId="550e9fa6-b716-4a7c-a498-f6e00ea526bf" valueTypeId="93353485-edba-49e3-aa60-3bfdbaa0166e"/>
<recordManagerType typeId="338906f6-10ab-4964-bef6-4dc84c49bad0" valueTypeId="6c5d6182-e8bd-4ef4-8ede-9d669253fbf9"/>
</producedTypes>
<name>ЦеныТоваров</name>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:InformationRegisterExtension">
<informationRegisterPeriodicity>Checked</informationRegisterPeriodicity>
<writeMode>Checked</writeMode>
<recordSetModule>Extended</recordSetModule>
<managerModule>Extended</managerModule>
</extension>
<informationRegisterPeriodicity>Day</informationRegisterPeriodicity>
</mdclass:InformationRegister>