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

Merge pull request #264 from bia-technologies/feature/222

Мокирование ADO.RecordSet
This commit is contained in:
Koryakin Aleksey 2024-02-25 02:43:03 +03:00 committed by GitHub
commit 2a72ec82d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 446 additions and 0 deletions

View File

@ -616,7 +616,26 @@
КонецЕсли;
КонецФункции
#КонецЕсли
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
// Возвращает мок для ADO.RecordSet.
//
// Параметры:
// Колонки - Строка - Имена колонок набора данных, разделенные запятой
// Описание - Строка - Описание, полезно для отладки и проверки
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТRecordSet - Мок ADO.RecordSet
Функция ADORecordSet(Колонки, Описание = Неопределено) Экспорт
Обработка = Обработки.ЮТRecordSet.Создать();
Обработка.Описание = Описание;
Обработка.Инициализировать(Колонки);
Возврат Обработка;
КонецФункции
#КонецЕсли
// Устанавливает значение реквизита ссылки

View File

@ -120,6 +120,7 @@
<commonModules>CommonModule.ЮТЧитательСервер</commonModules>
<dataProcessors>DataProcessor.ЮТHTTPServiceRequest</dataProcessors>
<dataProcessors>DataProcessor.ЮТHTTPСервисЗапрос</dataProcessors>
<dataProcessors>DataProcessor.ЮТRecordSet</dataProcessors>
<dataProcessors>DataProcessor.ЮТКонструкторТестовыхДанных</dataProcessors>
<dataProcessors>DataProcessor.ЮТЮнитТесты</dataProcessors>
</mdclass:Configuration>

View File

@ -0,0 +1,187 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2024 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
#Область ОписаниеПеременных
//@skip-check object-module-export-variable
Перем Fields Экспорт;
Перем Данные;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Добавляет запись в набор данных. Это данные, которые могут быть прочитаны через интерфейс RecordSet
//
// Параметры:
// Значение1 - Произвольный
// Значение2 - Произвольный
// Значение3 - Произвольный
// Значение4 - Произвольный
// Значение5 - Произвольный
// Значение6 - Произвольный
// Значение7 - Произвольный
// Значение8 - Произвольный
// Значение9 - Произвольный
// Значение10 - Произвольный
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТRecordSet - Эмулятор
//@skip-check method-too-many-params
Функция Добавить(Значение1,
Значение2 = Неопределено,
Значение3 = Неопределено,
Значение4 = Неопределено,
Значение5 = Неопределено,
Значение6 = Неопределено,
Значение7 = Неопределено,
Значение8 = Неопределено,
Значение9 = Неопределено,
Значение10 = Неопределено) Экспорт
Строка = Данные.Добавить();
УстановитьБезопасныйРежим(Истина);
Для Инд = 1 По Данные.Колонки.Количество() Цикл
Строка[Инд - 1] = Вычислить("Значение" + Инд);
КонецЦикла;
УстановитьФлаги();
Возврат ЭтотОбъект;
КонецФункции
// Переход к первой строке набора
Процедура MoveFirst() Экспорт
AbsolutePosition = 0;
УстановитьФлаги();
КонецПроцедуры
// Переход к следующей строке набора
Процедура MoveNext() Экспорт
AbsolutePosition = AbsolutePosition + 1;
УстановитьФлаги();
КонецПроцедуры
// Закрытие набора и очистка данных
Процедура Close() Экспорт
Данные = Неопределено;
УстановитьФлаги();
ОбновитьFields();
КонецПроцедуры
// Возвращает информацию о колонке набора
//
// Параметры:
// ИндексПоля - Число - Индекс колонки
//
// Возвращаемое значение:
// Структура - Fields:
// * Name - Строка - Имя колонки
// * Value - Произвольный - Значения колонки для текущей строки набора
Функция Fields(ИндексПоля) Экспорт
Если Данные <> Неопределено И Данные.Количество() <> 0 Тогда
Значение = Данные[AbsolutePosition][ИндексПоля];
Иначе
Значение = Неопределено
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат Новый Структура("Name, Value", Данные.Колонки[ИндексПоля].Имя, Значение);
КонецФункции
// Возвращает признак, что все записи набора прочитаны
//
// Возвращаемое значение:
// Булево
Функция EOF() Экспорт
Возврат EOF;
КонецФункции
// Возвращает признак, который показывает, находится ли текущее положение записи курсора перед первой записью
//
// Возвращаемое значение:
// Булево
Функция BOF() Экспорт
Возврат BOF;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Инициализирует эмулятор RecordSet. Устанавливает информацию о колонках и служебные данные.
// Параметры:
// Колонки - Строка - Имена колонок, разделенные запятой
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТRecordSet - Эмулятор
Функция Инициализировать(Знач Колонки) Экспорт
Данные = Новый ТаблицаЗначений();
Колонки = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Колонки, ",");
Для Каждого Колонка Из Колонки Цикл
Данные.Колонки.Добавить(Колонка);
КонецЦикла;
ОбновитьFields();
MoveFirst();
Возврат ЭтотОбъект;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура УстановитьФлаги()
EOF = Данные = Неопределено ИЛИ Данные.Количество() <= AbsolutePosition;
BOF = Данные = Неопределено ИЛИ Данные.Количество() = 0 ИЛИ AbsolutePosition < 0;
RecordCount = ?(Данные = Неопределено, 0, Данные.Количество());
КонецПроцедуры
Процедура ОбновитьFields()
Количество = ?(Данные = Неопределено, 0, Данные.Колонки.Количество());
Fields = Новый Структура("Count", Количество);
КонецПроцедуры
#КонецОбласти
#КонецЕсли

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="39fc0d14-3ae5-429b-90ec-e02a462ceed9">
<producedTypes>
<objectType typeId="40542278-a176-447b-b729-967555b6fbc5" valueTypeId="5802b53d-bb23-4f8e-b96b-9ba39325447a"/>
<managerType typeId="6d7fc763-87bb-4249-8308-775667798af9" valueTypeId="f1dcbc92-0692-415d-a538-8c7b774610d2"/>
</producedTypes>
<name>ЮТRecordSet</name>
<synonym>
<key>ru</key>
<value>Record set</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<attributes uuid="ae1fc2b5-5f77-4da1-b07b-c5e65c836e53">
<name>EOF</name>
<synonym>
<key>ru</key>
<value>EOF</value>
</synonym>
<type>
<types>Boolean</types>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
</attributes>
<attributes uuid="7353c07e-227b-4668-9784-76494d19b2fe">
<name>BOF</name>
<synonym>
<key>ru</key>
<value>BOF</value>
</synonym>
<type>
<types>Boolean</types>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
</attributes>
<attributes uuid="6cf16630-295c-4a45-a6d4-056b2fc4ff5d">
<name>Описание</name>
<synonym>
<key>ru</key>
<value>Описание</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers/>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
</attributes>
<attributes uuid="c69ffb7b-c905-436d-928f-2d12863946ac">
<name>AbsolutePosition</name>
<synonym>
<key>ru</key>
<value>Absolute position</value>
</synonym>
<type>
<types>Number</types>
<numberQualifiers>
<precision>10</precision>
</numberQualifiers>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
</attributes>
<attributes uuid="34d387d6-57b4-4c53-b066-bf46135c58fb">
<name>RecordCount</name>
<synonym>
<key>ru</key>
<value>Record count</value>
</synonym>
<type>
<types>Number</types>
<numberQualifiers>
<precision>10</precision>
<nonNegative>true</nonNegative>
</numberQualifiers>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
</attributes>
</mdclass:DataProcessor>

View File

@ -15,5 +15,6 @@
<content>CommonModule.МокитоСлужебный</content>
<content>DataProcessor.ЮТHTTPServiceRequest</content>
<content>DataProcessor.ЮТHTTPСервисЗапрос</content>
<content>DataProcessor.ЮТRecordSet</content>
<parentSubsystem>Subsystem.ЮТДвижок</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,151 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2024 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("Инициализировать")
.ДобавитьТест("Добавить")
.ДобавитьТест("MoveFirst")
.ДобавитьТест("MoveNext")
.ДобавитьТест("Close")
.ДобавитьТест("Fields")
;
КонецПроцедуры
Процедура Инициализировать() Экспорт
Набор = ЮТест.Данные().ADORecordSet("Колонка1, Колонка2");
ЮТест.ОжидаетЧто(Набор)
.Свойство("EOF").ЭтоИстина()
.Свойство("BOF").ЭтоИстина()
.Свойство("AbsolutePosition").Равно(0)
.Свойство("RecordCount").Равно(0)
.Свойство("Fields.Count").Равно(2)
КонецПроцедуры
Процедура Добавить() Экспорт
Набор = ЮТест.Данные().ADORecordSet("Колонка1, Колонка2");
ЮТест.ОжидаетЧто(Набор, "Инициализированный набор")
.Свойство("EOF").ЭтоИстина()
.Свойство("RecordCount").Равно(0);
ЮТест.ОжидаетЧто(Набор.Добавить(1, 2), "Набор с одной записью")
.Свойство("EOF").ЭтоЛожь()
.Свойство("RecordCount").Равно(1);
ЮТест.ОжидаетЧто(Набор.Добавить(2, 1), "Набор с двумя записями")
.Свойство("EOF").ЭтоЛожь()
.Свойство("RecordCount").Равно(2);
КонецПроцедуры
Процедура MoveFirst() Экспорт
Набор = ЮТест.Данные().ADORecordSet("Колонка1, Колонка2");
Набор.Добавить(1, 2);
Набор.Добавить(3, 4);
Набор.MoveNext();
Набор.MoveNext();
Набор.MoveNext();
ЮТест.ОжидаетЧто(Набор, "После сдвига в конец")
.Свойство("AbsolutePosition").Равно(3)
.Свойство("EOF").ЭтоИстина();
Набор.MoveFirst();
ЮТест.ОжидаетЧто(Набор, "После сдвига в начало")
.Свойство("AbsolutePosition").Равно(0)
.Свойство("EOF").ЭтоЛожь();
КонецПроцедуры
Процедура MoveNext() Экспорт
Набор = ЮТест.Данные().ADORecordSet("Колонка1, Колонка2");
Набор.Добавить(1, 2);
Набор.Добавить(3, 4);
Для Инд = 1 По 4 Цикл
Набор.MoveNext();
ЮТест.ОжидаетЧто(Набор, "После сдвига " + Инд)
.Свойство("AbsolutePosition").Равно(Инд)
.Свойство("EOF").Равно(Инд >= 2);
КонецЦикла;
КонецПроцедуры
Процедура Close() Экспорт
Набор = ЮТест.Данные().ADORecordSet("Колонка1, Колонка2");
Набор.Добавить(1, 2);
Набор.Close();
ЮТест.ОжидаетЧто(Набор)
.Свойство("EOF").ЭтоИстина()
.Свойство("BOF").ЭтоИстина()
.Свойство("AbsolutePosition").Равно(0)
.Свойство("RecordCount").Равно(0)
.Свойство("Fields.Count").Равно(0)
КонецПроцедуры
Процедура Fields() Экспорт
Набор = ЮТест.Данные().ADORecordSet("Колонка1, Колонка2");
ЮТест.ОжидаетЧто(Набор)
.Свойство("Fields.Count").Равно(2);
ЮТест.ОжидаетЧто(Набор.Fields(0))
.Свойство("Name").Равно("Колонка1")
.Свойство("Value").Равно(Неопределено);
ЮТест.ОжидаетЧто(Набор.Fields(1))
.Свойство("Name").Равно("Колонка2")
.Свойство("Value").Равно(Неопределено);
Набор.Добавить(1, 2);
Набор.Добавить(3, 4);
ЮТест.ОжидаетЧто(Набор.Fields(0))
.Свойство("Value").Равно(1);
ЮТест.ОжидаетЧто(Набор.Fields(1))
.Свойство("Value").Равно(2);
Набор.MoveNext();
ЮТест.ОжидаетЧто(Набор.Fields(0))
.Свойство("Value").Равно(3);
ЮТест.ОжидаетЧто(Набор.Fields(1))
.Свойство("Value").Равно(4);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="aacd5d44-f78c-4f23-bac9-d12f8a39ff26">
<name>Обр_ЮТRecordSet_МО</name>
<server>true</server>
</mdclass:CommonModule>

View File

@ -26,6 +26,7 @@
<commonTemplates>CommonTemplate.ЮТ_ТестовыеДанныеMarkdown</commonTemplates>
<commonModules>CommonModule.Интеграция</commonModules>
<commonModules>CommonModule.Обр_ЮТHTTPСервисЗапрос</commonModules>
<commonModules>CommonModule.Обр_ЮТRecordSet_МО</commonModules>
<commonModules>CommonModule.ОМ_Мокито</commonModules>
<commonModules>CommonModule.ОМ_МокитоОбучение</commonModules>
<commonModules>CommonModule.ОМ_МокитоСлужебный</commonModules>