Skip to content

Commit

Permalink
Merge pull request #407 from bia-technologies/feature/305
Browse files Browse the repository at this point in the history
305 / добавлен метод конструктора объекта/xdto `ФикцияРеквизитов`
  • Loading branch information
alkoleft authored Sep 4, 2024
2 parents 7bbf416 + cdb30fb commit 43d6886
Show file tree
Hide file tree
Showing 13 changed files with 206 additions and 31 deletions.
20 changes: 8 additions & 12 deletions documentation/docs/features/test-data/data-generation.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,15 @@ sidebar_position: 1
* В более компактной форме заполнять объект
* Имеет методы записи и проведения
* При возникновении ошибки оборачивает их в более понятные человеку описания
* Киллер фича - `Фикция` и `ФикцияОбязательныхПолей`. Устанавливает случайно сгенерированные значения реквизитов. Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений
* Киллер фича - `Фикция`, `ФикцияРеквизитов` и `ФикцияОбязательныхПолей`. Устанавливает случайно сгенерированные значения реквизитов. Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений
* Умеет создавать данные с клиента и [удалять их по окончании теста](test-data-deletion.md)

```bsl
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
.Фикция("Поставщик")
.Фикция("Склад")
.ФикцияРеквизитов("Поставщик, Склад")
.ФикцияОбязательныхПолей()
.ТабличнаяЧасть("Товары");
.ТабличнаяЧасть("Товары")
ОбщиеДанные = Новый Структура("ВидЦены, Поставщик", Закупочная, Конструктор.ДанныеОбъекта().Поставщик);
Для Инд = 1 По 3 Цикл
Expand Down Expand Up @@ -181,8 +180,7 @@ sidebar_position: 1
.УстановитьРеквизиты(Реквизиты)
.Фикция("Покупатель")
.ДобавитьНовый("Товары")
.Фикция("Цена")
.Фикция("Количество")
.ФикцияРеквизитов("Цена, Количество")
.ДанныеОбъекта();
```

Expand All @@ -197,6 +195,7 @@ sidebar_position: 1
* Для коллекций - генерируется случайно количество случайных элементов (на основании типа)
* `ФикцияОбязательныхПолей()` - на основании типа создаваемого объекта определяет список обязательных полей и для каждого из них вызывается метод `Фикция`.
* `ФикцияНезаполненных()` - для всех незаполненных полей создаваемого объекта вызывает метод `Фикция`.
* `ФикцияРеквизитов()` - для перечисленных полей создаваемого объекта вызывает метод `Фикция`.
* `ДобавитьНовый(ИмяРеквизита)` - Добавляет новый объект в указанную реквизит-коллекцию. Все последующие вызовы установки реквизитов будут относится к этому добавленному объекту.
* `ПерейтиКВладельцу()` - используется после метода `ДобавитьНовый` для переключения контекста заполнения на родительский объект. Например вам необходимо добавить две строки в табличную часть.
```bsl
Expand All @@ -206,8 +205,7 @@ sidebar_position: 1
.Фикция("Количество")
.ПерейтиКВладельцу()
.ДобавитьНовый("Товары")
.Фикция("Цена")
.Фикция("Количество")
.ФикцияРеквизитов("Цена, Количество")
.ДанныеОбъекта();
```
Здесь перед добавлением второй строки нужно переключится (`ПерейтиКВладельцу`) на основной объект и после этого можно добавить строку.
Expand All @@ -225,9 +223,7 @@ sidebar_position: 1
#КонецЕсли
Конструктор
.Фикция("Поставщик")
.Фикция("Склад")
.Фикция("Валюта")
.ФикцияРеквизитов("Поставщик, Склад, Валюта")
.Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина))
.ТабличнаяЧасть("Товары");
Expand Down
12 changes: 4 additions & 8 deletions documentation/docs/getting-started/auxiliary-modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
Expand Down Expand Up @@ -59,8 +58,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
Expand All @@ -74,8 +72,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
Expand All @@ -89,8 +86,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
Expand Down
8 changes: 2 additions & 6 deletions documentation/docs/getting-started/fluent-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
.Установить("Поставщик", Поставщик) // Устанавливает значение реквизита документа.
.Фикция("Дата") // Генерирует случайную дату.
.Фикция("Номер") // Генерирует случайный номер.
.Фикция("Склад") // Создает "пустышку" склада.
.Фикция("Валюта") // Создает "пустышку" валюты.
.ФикцияРеквизитов("Склад, Валюта") // Создает "пустышки" склада и валюты.
.ТабличнаяЧасть("Товары") // Переключает контекст на работу с табличной частью "Товары".
.ДобавитьСтроку() // Добавляет строку табличной части.
.Фикция("Товар", Новый Структура("Поставщик", Поставщик)) // Создает "пустышку" товары от конкретного поставщика.
Expand Down Expand Up @@ -52,10 +51,7 @@
```bsl title="Или вариант используя конструктора, но без цепочки вызовов"
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
Конструктор.Установить("Поставщик", Поставщик);
Конструктор.Фикция("Дата");
Конструктор.Фикция("Номер");
Конструктор.Фикция("Склад");
Конструктор.Фикция("Валюта");
Конструктор.ФикцияРеквизитов("Дата, Номер, Склад, Валюта");
Конструктор.ТабличнаяЧасть("Товары");
Конструктор.ДобавитьСтроку();
Конструктор.Фикция("Товар", Новый Структура("Поставщик", Поставщик));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,36 @@
Реквизиты = Реквизиты(Контекст);
ТекущаяЗапись = ТекущаяЗапись(Контекст);

ОписаниеРеквизитов = Новый Структура;
Для Каждого Элемент Из Реквизиты Цикл
Реквизит = Элемент.Значение;
Если Реквизит.Обязательный И НЕ ТекущаяЗапись.Свойство(Реквизит.Имя) Тогда
Значение = ЮТТестовыеДанныеСлужебный.Фикция(Реквизит.Тип);
ТекущаяЗапись.Вставить(Реквизит.Имя, Значение);
ОписаниеРеквизитов.Вставить(Реквизит.Имя, Реквизит.Тип);
КонецЕсли;
КонецЦикла;

ФикцияРеквизитовЗаписи(ТекущаяЗапись, ОписаниеРеквизитов);

КонецПроцедуры

Процедура ФикцияРеквизитов(Контекст, ИменаРеквизитов) Экспорт

ТекущаяЗапись = ТекущаяЗапись(Контекст);
ОписаниеРеквизитов = Новый Структура;

Если ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
КоллекцияИменРеквизитов = ЮТСтроки.РазделитьСтроку(ИменаРеквизитов, ",");
Иначе
КоллекцияИменРеквизитов = ИменаРеквизитов;
КонецЕсли;

Для Каждого ИмяРеквизита Из КоллекцияИменРеквизитов Цикл
Реквизит = ОписаниеРеквизита(Контекст, ИмяРеквизита);
ОписаниеРеквизитов.Вставить(ИмяРеквизита, Реквизит.Тип);
КонецЦикла;

ФикцияРеквизитовЗаписи(ТекущаяЗапись, ОписаниеРеквизитов);

КонецПроцедуры

Процедура ТабличнаяЧасть(Контекст, ИмяТабличнойЧасти) Экспорт
Expand Down Expand Up @@ -309,4 +331,11 @@

КонецФункции

Процедура ФикцияРеквизитовЗаписи(ТекущаяЗапись, ОписаниеРеквизитов)

ЗначенияРеквизитов = ЮТТестовыеДанныеСлужебный.ФикцияЗначений(ОписаниеРеквизитов);
ЮТКоллекции.ДополнитьСтруктуру(ТекущаяЗапись, ЗначенияРеквизитов);

КонецПроцедуры

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,37 @@

КонецФункции

Функция ФикцияЗначений(Реквизиты, РеквизитыЗаполнения = Неопределено) Экспорт

#Если ТонкийКлиент Тогда
НеобходимВызовСервера = Ложь;

Для Каждого Реквизит Из Реквизиты Цикл
СодержитСсылочныйТип = ?(ТипЗнч(Реквизит.Значение) = Тип("Тип"),
ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(Реквизит.Значение),
ЮТТипыДанныхСлужебный.СодержитСсылочныйТип(Реквизит.Значение));
Если СодержитСсылочныйТип Тогда
НеобходимВызовСервера = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

Если НеобходимВызовСервера Тогда
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.ФикцияЗначений(Реквизиты, РеквизитыЗаполнения);
КонецЕсли;
#КонецЕсли

Значения = Новый Структура;

Для Каждого Реквизит Из Реквизиты Цикл
Значение = Фикция(Реквизит.Значение, РеквизитыЗаполнения);
Значения.Вставить(Реквизит.Ключ, Значение);
КонецЦикла;

Возврат Значения;

КонецФункции

#Если Не ВебКлиент Тогда

// см. ЮТТестовыеДанные.НовоеИмяВременногоФайла
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,12 @@

КонецПроцедуры

Функция ФикцияЗначений(Знач Реквизиты, Знач РеквизитыЗаполнения) Экспорт

Возврат ЮТТестовыеДанныеСлужебный.ФикцияЗначений(Реквизиты, РеквизитыЗаполнения);

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,18 @@

КонецФункции

Функция СодержитСсылочныйТип(ОписаниеТипов) Экспорт

Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
Если ОписаниеТиповЛюбаяСсылка().СодержитТип(Тип) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;

Возврат Ложь;

КонецФункции

Функция ЭтоМенеджерЗаписи(ТипЗначения) Экспорт

ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@

Если НЕ ЮТФильтрацияСлужебный.ЭтоПодходящийМодуль(ОписаниеМодуля) Тогда
ЮТЛогирование.Отладка(" Пропущен, не подходит под отбор");
ИначеЕсли НЕ ЭтоТестовыйМодуль(ОписаниеМодуля) Тогда
ИначеЕсли НЕ ЭтоТестовыйМодуль(ОписаниеМодуля) Тогда
ЮТЛогирование.Отладка(" Пропущен, это не тестовый модуль");
Иначе
ЮТЛогирование.Отладка(" Добавлен");
Expand All @@ -196,8 +196,8 @@
// TODO Фильтрация по путям
ОписаниеМодуля = Неопределено;

#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если МетаданныеМодуля.КлиентОбычноеПриложение ИЛИ МетаданныеМодуля.КлиентУправляемоеПриложение Тогда
#Если ТолстыйКлиентОбычноеПриложение Тогда
Если МетаданныеМодуля.КлиентОбычноеПриложение Тогда

ОписаниеМодуля = ИсполняемыеСценарииМодуля(МетаданныеМодуля);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,36 @@

КонецФункции

// Устанавливает фиктивные значение реквизитов объекта.
//
// На основании типа реквизита генерируется фиктивное значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для объектных типов создается новый объект
// * Для коллекций - генерируется случайно количество случайных элементов (на основании типа)
//
// Параметры:
// ИменаРеквизитов - Строка - Имена реквизитов объекта или табличной части разделенные запятыми
// - Массив из Строка - Имена реквизитов объекта или табличной части
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор
Функция ФикцияРеквизитов(ИменаРеквизитов) Экспорт

Если ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
КоллекцияИменРеквизитов = ЮТСтроки.РазделитьСтроку(ИменаРеквизитов, ",");
Иначе
КоллекцияИменРеквизитов = ИменаРеквизитов;
КонецЕсли;

Для Каждого ИмяРеквизита Из КоллекцияИменРеквизитов Цикл
Фикция(ИмяРеквизита);
КонецЦикла;

Возврат ЭтотОбъект;

КонецФункции

// Заполняет обязательные реквизиты объекта фиктивными значениями
//
// На основании типа объекта определяются обязательные поля.
Expand Down
Loading

0 comments on commit 43d6886

Please sign in to comment.