Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ OneUnit поддерживает следующие аннотации для н

> Обратите внимание, что экземпляр тестового набора всё равно будет создан, если заданный тестовый метод отключен с помощью [условия](#16-условное-выполнение-тестов) (например `&Выключен`, `&ВыключенНаОС`, и т.д) даже если режим жизненного цикла `Компанейский` задан для тестового набора.

Если вы предпочитаете, чтобы OneUnit выполнял все тестовые методы на одном экземпляре тестового набора, аннотируйте конструктор своего тестового набора `&ТестовыйНабор(Характер = "Одиночка")`. При использовании этого режима новый экземпляр тестового набора будет создан только один раз. Таким образом, если ваши тестовые методы полагаются на состояние, хранящееся в переменных экземпляра тестового набора, вам может потребоваться сбросить это состояние в методах `&ПередКаждым` или `&ПослеКаждого`
Режим `&ТестовыйНабор(Характер = "Одиночка")` использует один экземпляр набора для всех его тестовых методов в пределах прогона. Каждый новый прогон создает свой экземпляр. Изменения полей сохраняются между тестами; при необходимости сбрасывайте их в методах `&ПередКаждым` или `&ПослеКаждого`.

### 1.10 Повторяемые тесты

Expand Down
19 changes: 9 additions & 10 deletions docs/api/Аннотации/ТестовыйНабор.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@
## ПриСозданииОбъекта

```bsl
// Аннотация указывает что сценарий является тестовым набором.
// Аннотацию необходимо размещать над конструктором сценария.
// Можно указать способ управления жизненным циклом тестового набора.
// Объявляет сценарий тестовым набором и задает жизненный цикл его экземпляров.
// Размещается над конструктором сценария.
//
// Параметры:
// Характер - Строка - Характер тестового набора,
// `Одиночка` - если тестовый набор должен быть создан один раз и использоваться для всех тестов.
// `Компанейский` - если тестовый набор должен быть создан для каждого теста.
// Характер - Строка - Режим использования экземпляров набора:
// `Одиночка` - один экземпляр на прогон для всех тестов набора.
// `Компанейский` - отдельный экземпляр для каждого теста.
// Значение по умолчанию: `Компанейский`
//
// Пример:
// // Этот сценарий является тестовым набором одиночкой
// &ТестовыйНабора(Характер = "Одиночка")
// Процедура ПриСозданииОбъекта() Экспорт
// &ТестовыйНабор(Характер = "Одиночка")
// Процедура ПриСозданииОбъекта()
// КонецПроцедуры
//
Процедура ПриСозданииОбъекта(Характер = "Компанейский")
Процедура ПриСозданииОбъекта(Характер = "Компанейский")
```
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
.ЗависитОт("atomic", "0.1.1")
.ЗависитОт("autumn", "5.0.1")
.ЗависитОт("autumn-cli", "1.3.0")
.ЗависитОт("autumn-event-publisher", "1.0.1")
.ЗависитОт("autumn-event-publisher", "1.0.2")
.ЗависитОт("autumn-logos", "1.3.3")
.ЗависитОт("autumn-mcp", "1.1.2")
.ЗависитОт("collectionos", "0.8.4")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Мета-аннотация, связывающая аннотацию параметра или поля с поставщиком значения.
// Значения параметров методов разрешаются перед вызовом метода, параметров
// конструктора - перед созданием набора, полей - после проверки условий узла
// и перед выполнением его методов.
// Поставщик должен реализовать функцию Значение(КонтекстЭлемента, КонтекстИсполнения).
// КонтекстЭлемента имеет тип КонтекстПараметра или КонтекстПоля.
//
// Параметры:
// Значение - Строка - Имя желудя-поставщика
//
&Аннотация("ПоставщикЗначения")
&Блестяшка
Процедура ПриСозданииОбъекта(Значение)
КонецПроцедуры
174 changes: 174 additions & 0 deletions src/core/internal/Классы/АргументыВызова.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
// Аргументы вызова метода или конструктора тестового набора.
// При создании задаются метаданные метода, позиционные значения и индексы
// заполняемых параметров. Их значения задаются методом Установить.
// Чтение заполняемого параметра до установки значения вызывает исключение.

#Использовать collectionos

Перем Метод; // СтрокаТаблицыЗначений - Метаданные вызываемого метода
Перем Позиционные; // ФиксированныйСписок из Произвольный - Позиционные значения вызова
Перем Заполняемые; // ФиксированныйСписок из Число - Индексы заполняемых параметров

// КартаСоответствие из КлючИЗначение - Позиции параметров с позиционными значениями:
// * Ключ - Число - Индекс параметра в сигнатуре
// * Значение - Число - Индекс в позиционных значениях
Перем Позиции;

// КартаСоответствие из КлючИЗначение - Значения, заданные методом Установить:
// * Ключ - Число - Индекс параметра
// * Значение - Произвольный - Значение параметра или приватный маркер Неопределено
Перем Значения;

Перем МаркерНеопределено; // Структура - Пустой объект, обозначающий Неопределено в карте значений

// Метаданные вызываемого метода
//
// Возвращаемое значение:
// СтрокаТаблицыЗначений - Метаданные метода
//
Функция Метод() Экспорт
Возврат Метод;
КонецФункции

// Индексы параметров, значения которых задаются методом Установить
//
// Возвращаемое значение:
// ФиксированныйСписок из Число - Индексы параметров, начиная с нуля
//
Функция ИндексыЗаполняемыхПараметров() Экспорт
Возврат Заполняемые;
КонецФункции

// Признак наличия заполняемых параметров
//
// Возвращаемое значение:
// Булево - Истина - есть параметры, доступные для заполнения
//
Функция ТребуютЗаполнения() Экспорт
Возврат Не Заполняемые.Пусто();
КонецФункции

// Устанавливает значение заполняемого параметра.
// Вызывает исключение, если параметр недоступен для заполнения или значение уже установлено.
//
// Параметры:
// Индекс - Число - Индекс параметра в сигнатуре, начиная с нуля
// Значение - Произвольный - Значение параметра
//
Процедура Установить(Знач Индекс, Значение) Экспорт

Описание = ОписаниеПараметра(Индекс);

Если Не Заполняемые.Содержит(Индекс) Тогда
ВызватьИсключение СтрШаблон("Параметр %1 недоступен для заполнения", Описание);
КонецЕсли;

Хранимое = ?(Значение = Неопределено, МаркерНеопределено, Значение);

Если Значения.ВставитьЕслиОтсутствует(Индекс, Хранимое).СодержитЗначение() Тогда
ВызватьИсключение СтрШаблон("Значение параметра %1 уже получено", Описание);
КонецЕсли;

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

// Возвращает значение параметра по индексу в сигнатуре.
// Для заполняемого параметра возвращает значение, заданное методом Установить;
// если оно не задано, вызывает исключение. Для остальных параметров использует
// позиционное значение, а при его отсутствии - значение по умолчанию или Неопределено.
//
// Параметры:
// Индекс - Число - Индекс параметра в сигнатуре, начиная с нуля
//
// Возвращаемое значение:
// Произвольный - Значение параметра
//
Функция Значение(Знач Индекс) Экспорт

Параметр = Метод.Параметры.Получить(Индекс);

Если Не Заполняемые.Содержит(Индекс) Тогда

Позиция = Позиции.Получить(Индекс).Получить();

Если Позиция < Позиционные.Количество() Тогда
Возврат Позиционные.Получить(Позиция);
КонецЕсли;

Возврат ?(Параметр.ЕстьЗначениеПоУмолчанию, Параметр.ЗначениеПоУмолчанию, Неопределено);

КонецЕсли;

Полученное = Значения.Получить(Индекс);

Если Не Полученное.СодержитЗначение() Тогда
ВызватьИсключение СтрШаблон("Значение параметра %1 не установлено", ОписаниеПараметра(Индекс));
КонецЕсли;

Хранимое = Полученное.Получить();
Возврат ?(Хранимое = МаркерНеопределено, Неопределено, Хранимое);

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

// Возвращает список аргументов для вызова метода.
// При наличии заполняемых параметров собирает значения в порядке параметров метода
// с помощью метода Значение и добавляет лишние позиционные аргументы в конец списка.
// Если заполняемых параметров нет, возвращает исходный список позиционных значений.
//
// Возвращаемое значение:
// ФиксированныйСписок из Произвольный - Значения параметров метода
//
Функция Значения() Экспорт

Если Не ТребуютЗаполнения() Тогда
Возврат Позиционные;
КонецЕсли;

Результат = Новый СписокМассив;

Для Индекс = 0 По Метод.Параметры.Количество() - 1 Цикл
Результат.Добавить(Значение(Индекс));
КонецЦикла;

// Сохраняем лишние аргументы для проверки их количества при вызове метода
Позиционные.ПроцессорКоллекции()
.Пропустить(Позиции.Количество())
.ДляКаждого(Новый Действие(Результат, "Добавить"));

Возврат Новый ФиксированныйСписок(Результат);

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

Функция ОписаниеПараметра(Знач Индекс)

Возврат СтрШаблон(
"%1 метода %2",
Метод.Параметры.Получить(Индекс).Имя,
Метод.Имя
);

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

// Создает аргументы вызова с указанными позиционными значениями
//
// Параметры:
// ОписаниеМетода - СтрокаТаблицыЗначений - Метаданные вызываемого метода
// ПозиционныеПараметры - ФиксированныйСписок из Произвольный - Позиционные значения
// ЗаполняемыеПараметры - ФиксированныйСписок из Число - Индексы параметров, доступных для заполнения
//
Процедура ПриСозданииОбъекта(ОписаниеМетода, ПозиционныеПараметры, ЗаполняемыеПараметры)

Метод = ОписаниеМетода;
Позиционные = ПозиционныеПараметры;
Заполняемые = ЗаполняемыеПараметры;
Позиции = Новый КартаСоответствие;
Значения = Новый КартаСоответствие;

МаркерНеопределено = Новый Структура;

Для Индекс = 0 По Метод.Параметры.Количество() - 1 Цикл
Если Не Заполняемые.Содержит(Индекс) Тогда
Позиции.Вставить(Индекс, Позиции.Количество());
КонецЕсли;
КонецЦикла;

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