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

Merge pull request #407 from bia-technologies/feature/305

305 / добавлен метод конструктора объекта/xdto `ФикцияРеквизитов`
This commit is contained in:
Koryakin Aleksey 2024-09-04 22:14:57 +03:00 committed by GitHub
commit 43d688635d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 206 additions and 31 deletions

View File

@ -130,16 +130,15 @@ sidebar_position: 1
* В более компактной форме заполнять объект
* Имеет методы записи и проведения
* При возникновении ошибки оборачивает их в более понятные человеку описания
* Киллер фича - `Фикция` и `ФикцияОбязательныхПолей`. Устанавливает случайно сгенерированные значения реквизитов. Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений
* Киллер фича - `Фикция`, `ФикцияРеквизитов` и `ФикцияОбязательныхПолей`. Устанавливает случайно сгенерированные значения реквизитов. Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений
* Умеет создавать данные с клиента и [удалять их по окончании теста](test-data-deletion.md)
```bsl
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
.Фикция("Поставщик")
.Фикция("Склад")
.ФикцияРеквизитов("Поставщик, Склад")
.ФикцияОбязательныхПолей()
.ТабличнаяЧасть("Товары");
.ТабличнаяЧасть("Товары")
ОбщиеДанные = Новый Структура("ВидЦены, Поставщик", Закупочная, Конструктор.ДанныеОбъекта().Поставщик);
Для Инд = 1 По 3 Цикл
@ -181,8 +180,7 @@ sidebar_position: 1
.УстановитьРеквизиты(Реквизиты)
.Фикция("Покупатель")
.ДобавитьНовый("Товары")
.Фикция("Цена")
.Фикция("Количество")
.ФикцияРеквизитов("Цена, Количество")
.ДанныеОбъекта();
```
@ -197,6 +195,7 @@ sidebar_position: 1
* Для коллекций - генерируется случайно количество случайных элементов (на основании типа)
* `ФикцияОбязательныхПолей()` - на основании типа создаваемого объекта определяет список обязательных полей и для каждого из них вызывается метод `Фикция`.
* `ФикцияНезаполненных()` - для всех незаполненных полей создаваемого объекта вызывает метод `Фикция`.
* `ФикцияРеквизитов()` - для перечисленных полей создаваемого объекта вызывает метод `Фикция`.
* `ДобавитьНовый(ИмяРеквизита)` - Добавляет новый объект в указанную реквизит-коллекцию. Все последующие вызовы установки реквизитов будут относится к этому добавленному объекту.
* `ПерейтиКВладельцу()` - используется после метода `ДобавитьНовый` для переключения контекста заполнения на родительский объект. Например вам необходимо добавить две строки в табличную часть.
```bsl
@ -206,8 +205,7 @@ sidebar_position: 1
.Фикция("Количество")
.ПерейтиКВладельцу()
.ДобавитьНовый("Товары")
.Фикция("Цена")
.Фикция("Количество")
.ФикцияРеквизитов("Цена, Количество")
.ДанныеОбъекта();
```
Здесь перед добавлением второй строки нужно переключится (`ПерейтиКВладельцу`) на основной объект и после этого можно добавить строку.
@ -225,9 +223,7 @@ sidebar_position: 1
#КонецЕсли
Конструктор
.Фикция("Поставщик")
.Фикция("Склад")
.Фикция("Валюта")
.ФикцияРеквизитов("Поставщик, Склад, Валюта")
.Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина))
.ТабличнаяЧасть("Товары");

View File

@ -27,8 +27,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
@ -59,8 +58,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
@ -74,8 +72,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции
@ -89,8 +86,7 @@
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Установить("Номенклатура", Товар)
.Фикция("Количество")
.Фикция("Цена")
.ФикцияРеквизитов("Количество, Цена")
.Записать();
КонецФункции

View File

@ -11,8 +11,7 @@
.Установить("Поставщик", Поставщик) // Устанавливает значение реквизита документа.
.Фикция("Дата") // Генерирует случайную дату.
.Фикция("Номер") // Генерирует случайный номер.
.Фикция("Склад") // Создает "пустышку" склада.
.Фикция("Валюта") // Создает "пустышку" валюты.
.ФикцияРеквизитов("Склад, Валюта") // Создает "пустышки" склада и валюты.
.ТабличнаяЧасть("Товары") // Переключает контекст на работу с табличной частью "Товары".
.ДобавитьСтроку() // Добавляет строку табличной части.
.Фикция("Товар", Новый Структура("Поставщик", Поставщик)) // Создает "пустышку" товары от конкретного поставщика.
@ -52,10 +51,7 @@
```bsl title="Или вариант используя конструктора, но без цепочки вызовов"
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
Конструктор.Установить("Поставщик", Поставщик);
Конструктор.Фикция("Дата");
Конструктор.Фикция("Номер");
Конструктор.Фикция("Склад");
Конструктор.Фикция("Валюта");
Конструктор.ФикцияРеквизитов("Дата, Номер, Склад, Валюта");
Конструктор.ТабличнаяЧасть("Товары");
Конструктор.ДобавитьСтроку();
Конструктор.Фикция("Товар", Новый Структура("Поставщик", Поставщик));

View File

@ -63,14 +63,36 @@
Реквизиты = Реквизиты(Контекст);
ТекущаяЗапись = ТекущаяЗапись(Контекст);
ОписаниеРеквизитов = Новый Структура;
Для Каждого Элемент Из Реквизиты Цикл
Реквизит = Элемент.Значение;
Если Реквизит.Обязательный И НЕ ТекущаяЗапись.Свойство(Реквизит.Имя) Тогда
Значение = ЮТТестовыеДанныеСлужебный.Фикция(Реквизит.Тип);
ТекущаяЗапись.Вставить(Реквизит.Имя, Значение);
ОписаниеРеквизитов.Вставить(Реквизит.Имя, Реквизит.Тип);
КонецЕсли;
КонецЦикла;
ФикцияРеквизитовЗаписи(ТекущаяЗапись, ОписаниеРеквизитов);
КонецПроцедуры
Процедура ФикцияРеквизитов(Контекст, ИменаРеквизитов) Экспорт
ТекущаяЗапись = ТекущаяЗапись(Контекст);
ОписаниеРеквизитов = Новый Структура;
Если ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
КоллекцияИменРеквизитов = ЮТСтроки.РазделитьСтроку(ИменаРеквизитов, ",");
Иначе
КоллекцияИменРеквизитов = ИменаРеквизитов;
КонецЕсли;
Для Каждого ИмяРеквизита Из КоллекцияИменРеквизитов Цикл
Реквизит = ОписаниеРеквизита(Контекст, ИмяРеквизита);
ОписаниеРеквизитов.Вставить(ИмяРеквизита, Реквизит.Тип);
КонецЦикла;
ФикцияРеквизитовЗаписи(ТекущаяЗапись, ОписаниеРеквизитов);
КонецПроцедуры
Процедура ТабличнаяЧасть(Контекст, ИмяТабличнойЧасти) Экспорт
@ -309,4 +331,11 @@
КонецФункции
Процедура ФикцияРеквизитовЗаписи(ТекущаяЗапись, ОписаниеРеквизитов)
ЗначенияРеквизитов = ЮТТестовыеДанныеСлужебный.ФикцияЗначений(ОписаниеРеквизитов);
ЮТКоллекции.ДополнитьСтруктуру(ТекущаяЗапись, ЗначенияРеквизитов);
КонецПроцедуры
#КонецОбласти

View File

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

View File

@ -267,6 +267,12 @@
КонецПроцедуры
Функция ФикцияЗначений(Знач Реквизиты, Знач РеквизитыЗаполнения) Экспорт
Возврат ЮТТестовыеДанныеСлужебный.ФикцияЗначений(Реквизиты, РеквизитыЗаполнения);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -66,6 +66,18 @@
КонецФункции
Функция СодержитСсылочныйТип(ОписаниеТипов) Экспорт
Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
Если ОписаниеТиповЛюбаяСсылка().СодержитТип(Тип) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция ЭтоМенеджерЗаписи(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);

View File

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

View File

@ -85,6 +85,36 @@
КонецФункции
// Устанавливает фиктивные значение реквизитов объекта.
//
// На основании типа реквизита генерируется фиктивное значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для объектных типов создается новый объект
// * Для коллекций - генерируется случайно количество случайных элементов (на основании типа)
//
// Параметры:
// ИменаРеквизитов - Строка - Имена реквизитов объекта или табличной части разделенные запятыми
// - Массив из Строка - Имена реквизитов объекта или табличной части
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТКонструкторОбъектаXDTO - Конструктор
Функция ФикцияРеквизитов(ИменаРеквизитов) Экспорт
Если ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
КоллекцияИменРеквизитов = ЮТСтроки.РазделитьСтроку(ИменаРеквизитов, ",");
Иначе
КоллекцияИменРеквизитов = ИменаРеквизитов;
КонецЕсли;
Для Каждого ИмяРеквизита Из КоллекцияИменРеквизитов Цикл
Фикция(ИмяРеквизита);
КонецЦикла;
Возврат ЭтотОбъект;
КонецФункции
// Заполняет обязательные реквизиты объекта фиктивными значениями
//
// На основании типа объекта определяются обязательные поля.

View File

@ -90,6 +90,30 @@
КонецФункции
// Устанавливает фиктивные значения реквизитов создаваемого объекта.
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливается значения реквизитов строки табличной части.
//
// На основании менеджера и имени реквизита вычисляется его тип, а по типу генерируется фиктивное значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для ссылочных типов создается новый объект
// * Для перечислений (в том числе системных) выбирается случайно значение перечисления
//
// Параметры:
// ИменаРеквизитов - Строка - Имена реквизитов объекта или табличной части разделенные запятыми
// - Массив из Строка - Имена реквизитов объекта или табличной части
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция ФикцияРеквизитов(ИменаРеквизитов) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ФикцияРеквизитов(Контекст, ИменаРеквизитов);
Возврат ЭтотОбъект;
КонецФункции
// Заполняет обязательные поля объекта фиктивными значениями
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливаются значения реквизитов строки табличной части.

View File

@ -86,6 +86,29 @@
КонецФункции
// Устанавливает фиктивные значения реквизитов создаваемого объекта.
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливается значения реквизитов строки табличной части.
//
// На основании менеджера и имени реквизита вычисляется его тип, а по типу генерируется фиктивное значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для ссылочных типов создается новый объект
// * Для перечислений (в том числе системных) выбирается случайно значение перечисления
//
// Параметры:
// ИменаРеквизитов - Строка - Имена реквизитов объекта или табличной части разделенные запятыми
// - Массив из Строка - Имена реквизитов объекта или табличной части
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТКонструкторТестовыхДанных - Конструктор
Функция ФикцияРеквизитов(ИменаРеквизитов) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ФикцияРеквизитов(Контекст, ИменаРеквизитов);
Возврат ЭтотОбъект;
КонецФункции
// Заполняет обязательные поля объекта фиктивными значениями
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливаются значения реквизитов строки табличной части.

View File

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

View File

@ -28,6 +28,7 @@
.ДобавитьТест("ФикцияНезаполненных")
.ДобавитьТест("ДобавитьНовый")
.ДобавитьТест("ПерейтиКВладельцу")
.ДобавитьТест("ФикцияРеквизитов")
;
КонецПроцедуры
@ -164,6 +165,21 @@
КонецПроцедуры
Процедура ФикцияРеквизитов() Экспорт
Объект = НовыйКонструктор()
.ФикцияРеквизитов("Number, Сумма, Покупатель")
.ДанныеОбъекта();
ЮТест.ОжидаетЧто(Объект)
.ИмеетТип(Тип("ОбъектXDTO"))
.Свойство("Number").Заполнено()
.Свойство("Сумма").Заполнено()
.Свойство("Покупатель").Заполнено()
;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции