diff --git a/docs/mockito.md b/docs/mockito.md new file mode 100644 index 00000000..7e124ad8 --- /dev/null +++ b/docs/mockito.md @@ -0,0 +1,258 @@ +# Мокито + +Мокито - модуль созданный по образу популярного java-фреймворка для тестирования [Mockito](https://site.mockito.org/). Расширяет возможности тестирования, позволяет легко менять логику работы системы подменяя результаты работы методов, отключая какие-либо алгоритмы и проверки. + +Юнит-тесты, это тесты конкретных методов в отрыве от системы - контролировать данные используемые методом, изменение логики и ошибки других объектов не должны аффектить на тест. +В реальных конфигурациях объекты тесно связаны друг с другом, поэтому добиться контроля влияющих данных очень сложно. Обычно приходится создавать большой объем тестовых данных. А добиться изоляции от изменения логики других объектов почти невозможно. Мокирование же позволяет изменить логику работы системы таким образом, чтобы тестируемый метод не вызывал другие методы и использовал уже подготовленные данные. Например, для тестирования проведения реализации товаров мы можем подменить результат функции формирующей таблицу проводок и избежать сложной подготовки данных. + +С помощью Мокито разработчик указывает, что делать при вызове определенных методов - вернуть нужный результат, вызвать исключение или просто не трогать ненужные методы. После тестирования разработчик может запросить и проверить статистику о вызовах, как и какие методы были вызваны. + +Пример: + +```bsl +ОтветСерверы = ОтветУспешногоЗапроса("Серверы"); +ОтветДиски = ОтветУспешногоЗапроса("Диски"); + +Мокито.Обучение(РаботаСHTTP) + .Когда(РаботаСHTTP.ВыполнитьЗапрос(ПараметрыПодключения, "/hosts", "GET")) + .Вернуть(ОтветСерверы) + .Когда(РаботаСHTTP.ВыполнитьЗапрос(ПараметрыПодключения, "/disks", "GET")) + .Вернуть(ОтветДиски) + .Прогон(); + +Результат = БиллингДрайверГипервизорNutanix.Серверы(ПараметрыПодключения); +``` + +В этом примере изменяется работа модуля `РаботаСHTTP`, для функции `ВыполнитьЗапрос`, вызванной с нужными параметрами будет возвращено подготовленное значение, а сам метод не будет вызван. +Мы получим ожидаемые ответы на запросы к сторонней системе и уйдет от проблем связанных с ней - недоступность, изменение контрактов и т.д. + +Работа с Мокито делится на 3 стадии: + +1. Обучение - настраиваем поведение методов системы +2. Прогон - выполнение теста целевого метода +3. Проверка - анализ вызовов + +## Использование + +### Настройка мокируемых методов + +Для работы Мокито вам необходимо добавить интересующие методы в тестовое расширение. + +Эта позволит управлять поведением метода: + +* подменять результат во время выполнения теста +* использовать явный вызов метода с параметрами на стадии обучения, например `Мокито.Обучение(Справочники.ИсточникиДанных).Когда(Справочники.ИсточникиДанных.СохраненныеБезопасныеДанные(Справочник)).Вернуть(Результат)` +* использовать явный вызов метода с параметрами на стадии проверки, например `Мокито.Проверить(Справочники.ИсточникиДанных).КоличествоВызовов(Справочники.ИсточникиДанных.СохраненныеБезопасныеДанные(Справочник)).Больше(1)` + +Примеры добавления методов в расширение: + +#### Метод общего модуля + +Добавляем обработку метода `ИнициализироватьВнешнююКомпоненту` общего модуля `ОбщегоНазначенияКлиентСервер` + +```bsl +&Вместо("ИнициализироватьВнешнююКомпоненту") +Функция ЮТИнициализироватьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ВызыватьИсключение, ПаузаЧерезКомпоненту) Экспорт + // Собираем параметры в массив + ПараметрыМетода = Мокито.МассивПараметров(ИмяМакета, ИмяКомпоненты, ВызыватьИсключение, ПаузаЧерезКомпоненту); + + // Отправляем данные на анализ + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(ОбщегоНазначенияКлиентСервер, "ИнициализироватьВнешнююКомпоненту", ПараметрыМетода, ПрерватьВыполнение); + + // Обрабатываем результат анализа + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(ИмяМакета, ИмяКомпоненты, ВызыватьИсключение, ПаузаЧерезКомпоненту); + Иначе + Возврат Результат; + КонецЕсли; +КонецФункции +``` + +#### Метод модуля менеджера + +Добавляем обработку метода `СохраненныеБезопасныеДанные` модуля менеджера справочника `Справочники.ИсточникиДанных` + +```bsl +&Вместо("СохраненныеБезопасныеДанные") +Функция ЮТСохраненныеБезопасныеДанные(Владелец, Знач Ключи) Экспорт + + // Собираем параметры в массив + ПараметрыМетода = Мокито.МассивПараметров(Владелец, Ключи); + + // Отправляем данные на анализ + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(Справочники.ИсточникиДанных, "СохраненныеБезопасныеДанные", ПараметрыМетода, ПрерватьВыполнение); + + // Обрабатываем результат анализа + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(Владелец, Ключи); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции +``` + +#### Метод модуля объекта + +Добавляем обработку приватного метода `ПеренестиДанныеВБезопасноеХранилище` модуля объекта справочника `Справочники.ИсточникиДанных` + +```bsl +&Вместо("ПеренестиДанныеВБезопасноеХранилище") +Функция ЮТПеренестиДанныеВБезопасноеХранилище(Ключи) + + // Собираем параметры в массив + ПараметрыМетода = Мокито.МассивПараметров(Ключи); + + // Отправляем данные на анализ + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(ЭтотОбъект, "ПеренестиДанныеВБезопасноеХранилище", ПараметрыМетода, ПрерватьВыполнение); + + // Обрабатываем результат анализа + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(Ключи); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции +``` + +### Обучение + +Самая первая стадия при написании тестов использующих моки - обучение. +Мы создаем правила как будет вести себя метод при различных вариантах вызова. +Правило состоит из условий проверки параметров и действия выполняемого при соблюдении условий. + +Условия можно задать на равенство определенному значению, на проверку типа переданного значения или же безусловно принимать любый параметры + + +Существует 2 основных подхода к формированию условий вызова: + +1. Явный вызов метода с параметрами: `Обучение(РаботаСHTTP).Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(ИсточникДанных, Данные)).Вернуть(2)` +2. Указание имени метода и набора параметров: `Обучение(РаботаСHTTP).Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(ИсточникДанных, Данные)).Вернуть(2)` + +Первый вариант имеет ряд недостатков: + +1. Работает только для экспортных методов +2. Необходимо передавать все обязательные параметры или использовать для них маску `Мокито.ЛюбойПараметр()` +3. Если не указывать необязательные параметры, то их значения по умолчанию попадут в настройку. Покажу на примере. + Имеется метод `Функция Метод(Параметр1, Параметр2, Параметр3 = 3)` + + Настройка `Когда(Метод(1, 2)).Вернуть(0)`, в результате ноль мы получим для вызовов + + * `Метод(1, 2)` + * `Метод(1, 2, 3)` + + Для вызова `Метод(1, 2, 4)` будет выполнен основной алгоритм метода. + + А для настройки `Когда("Метод", Мокито.МассивПараметров(1, 2)).Вернуть(0)` все три варианта вызова вернут ноль. + +После того как определились с условием вызова указанным в методе `Когда` нужно указать реакцию. Возможные реакции: + +* `Вернуть` - вернуть указанное значение +* `ВыброситьИсключение` - вызвать исключение с переданным текстом +* `Пропустить` - пропустить выполнение метод (актуально для процедур) + +#### Примеры формирования различных вариантов условий + +Имеется метод: + +```bsl +Функция ОтправитьОбъектНаСервер(ИсточникДанных, Объект, HTTPМетод = "POST", + ТипКонтента = "json", Преобразование = Неопределено, + ДопНастройки = Неопределено, Ответ = Неопределено, ОтветВСтруктуру = Ложь, + ТелоОтветаВХранилище = Ложь) Экспорт +``` + +* Переопределить все вызовы метода - указываем имя метода без указания параметров + `Мокито.Обучение(РаботаСHTTP).Когда("ОтправитьОбъектНаСервер").Вернуть(1)` +* Переопределить вызов, когда первый параметр имеет определенное значение + 1. `Мокито.Обучение(РаботаСHTTP).Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(ИсточникДанных)).Вернуть(2)` + 2. `Мокито.Обучение(РаботаСHTTP).Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(ИсточникДанных, Мокито.ЛюбойПараметр()).Вернуть(2)`. Тут используется маска `Мокито.ЛюбойПараметр()`, тк второй параметр является обязательным +* Переопределить вызов, когда **второй** параметр имеет определенное значение + 1. `Мокито.Обучение(РаботаСHTTP).Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Мокито.ЛюбойПараметр(), Объект)).Вернуть(2)` + 2. `Мокито.Обучение(РаботаСHTTP).Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Мокито.ЛюбойПараметр(), Объект).Вернуть(2)`. +* Условие на тип параметра + 1. `Мокито.Обучение(РаботаСHTTP).Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Мокито.ТипизированныйПараметр(ТипИсточникДанных), Мокито.ЧисловойПараметр())).Вернуть(3)` + 2. `Мокито.Обучение(РаботаСHTTP).Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Мокито.ТипизированныйПараметр(ТипИсточникДанных), Мокито.ЧисловойПараметр()).Вернуть(3)` + +## Прогон + +После обучения, настройки реакций на вызовы методов, можно запускать тест нужного метода. Для перехода к этому режиму работы Мокито используется метод `Прогон`. + +Все вызовы к настроенным методам (добавленным в расширение) будут перехватываться и анализироваться на совпадение условий вызова. +Для вызовов, у которых есть подходящая "реакция" будет переопределено выполнение и запустится соответствующая реакция (вернуть значение, вызвать исключение и тд), для прочих - выполнение продолжится. + +```bsl +// Настройка +Мокито.Обучение(РаботаСHTTP) + .Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Мокито.ЛюбойПараметр(), Мокито.ЛюбойПараметр())) + .Вернуть(РезультатПоУмолчанию) + .Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Справочники.ИсточникиДанных.FTP, 2)) + .Вернуть(2) + .Прогон(); // Перевод в режим прогона теста + +Результат = РаботаСHTTP.ОтправитьОбъектНаСервер(ИсточникДанных, Данные); // Результат будет равен переменной РезультатПоУмолчанию +Результат = РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2); // Результат будет равен 2 +``` + +## Проверка + +После прогона теста можно проверить какие методы, с какими параметрами вызывались. Для этих целей необходимо воспользоваться методом `Проверить` + +```bsl +Мокито.Проверить(РаботаСHTTP) // Устанавливаем проверяемый объект + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(ЛюбойПараметр, Мокито.ЧисловойПараметр())) // Условия поиска вызовов + .Больше(1) // Проверки + .Равно(2) + .КоличествоВызовов("ОтправитьОбъектНаСервер").Заполнено().Равно(3).Меньше(6) + .КоличествоВызовов("ОтправитьЗапросHTTP").Пусто().Меньше(1) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(1, 2)).Равно(1) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(ЛюбойПараметр, ЛюбойПараметр)).Равно(3) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(Мокито.ТипизированныйПараметр(ТипИсточникДанных), ЛюбойПараметр)).Равно(1) +``` + +Принцип формирования проверки: + +* Указываем проверяемый объект `Проверить(РаботаСHTTP)`. +* Указываем условия поиска вызовов метода. Логика формирования условия такая же как при обучении. + Например, `КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(ЛюбойПараметр, Мокито.ЧисловойПараметр()))` + Соберет все вызовы метода `РаботаСHTTP.ОтправитьОбъектНаСервер`, к которых вторым параметром идет число, а 3й и последующий параметры имеют значения по умолчанию. +* Проверяем собранные вызовы: + * `Заполнено` - есть вызовы метода по указанным условиям + * `Пусто` - нет вызовов метода по указанным условиям + * `Равно` - количество вызовов попавших под условия равно указанному значению + * `Больше` - количество вызовов попавших под условия больше указанного значения + * `Меньше` - количество вызовов попавших под условия меньше указанного значения + +## Кейсы использования\* + +\* *В примерах опускается часть добавления метода в расширение* + +1. Подмена результат функции для любого вызова + + ```bsl + Мокито.Обучение(РаботаСHTTP) + .Когда("ОтправитьОбъектНаСервер") + .Вернуть(1) + ``` + +2. Выключение алгоритма проведения документа + + ```bsl + Мокито.Обучение(СсылкаИлиОбъектДокумент) + .Когда("ОбработкаПроведения") + .Пропустить() + ``` + +3. Выбросить исключение, если в метод передан некорректный набор параметров + + ```bsl + Мокито.Обучение(РаботаСHTTP) + .Когда("ОтправитьОбъектНаСервер") + .ВыброситьИсключение("Не верные параметры вызова") + .Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, Мокито.ЛюбойПараметр())) + .ВыполнитьМетод(); + ``` diff --git a/exts/yaxunit/DT-INF/PROJECT.PMF b/exts/yaxunit/DT-INF/PROJECT.PMF index 3b39ff43..16b36590 100644 --- a/exts/yaxunit/DT-INF/PROJECT.PMF +++ b/exts/yaxunit/DT-INF/PROJECT.PMF @@ -1,3 +1,3 @@ Manifest-Version: 1.0 Runtime-Version: 8.3.10 -Base-Project: configuration +Base-Project: BSP diff --git a/exts/yaxunit/src/Catalogs/ДополнительныеПараметрыЖурналаДействийПользователя/ObjectModule.bsl b/exts/yaxunit/src/Catalogs/ДополнительныеПараметрыЖурналаДействийПользователя/ObjectModule.bsl new file mode 100644 index 00000000..5bff8e14 --- /dev/null +++ b/exts/yaxunit/src/Catalogs/ДополнительныеПараметрыЖурналаДействийПользователя/ObjectModule.bsl @@ -0,0 +1,33 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +&Вместо("ПолучитьСтруктуруИзХранилища") +Функция ЮТПолучитьСтруктуруИзХранилища() Экспорт + + ПараметрыМетода = Новый Массив();; + + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(ЭтотОбъект, "ПолучитьСтруктуруИзХранилища", ПараметрыМетода, ПрерватьВыполнение); + + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции diff --git a/exts/yaxunit/src/Catalogs/ДополнительныеПараметрыЖурналаДействийПользователя/ДополнительныеПараметрыЖурналаДействийПользователя.mdo b/exts/yaxunit/src/Catalogs/ДополнительныеПараметрыЖурналаДействийПользователя/ДополнительныеПараметрыЖурналаДействийПользователя.mdo new file mode 100644 index 00000000..e6e826be --- /dev/null +++ b/exts/yaxunit/src/Catalogs/ДополнительныеПараметрыЖурналаДействийПользователя/ДополнительныеПараметрыЖурналаДействийПользователя.mdo @@ -0,0 +1,15 @@ + + + + + + + + + + ДополнительныеПараметрыЖурналаДействийПользователя + Adopted + + Extended + + diff --git a/exts/yaxunit/src/Catalogs/ИсточникиДанных/ManagerModule.bsl b/exts/yaxunit/src/Catalogs/ИсточникиДанных/ManagerModule.bsl new file mode 100644 index 00000000..8837b158 --- /dev/null +++ b/exts/yaxunit/src/Catalogs/ИсточникиДанных/ManagerModule.bsl @@ -0,0 +1,40 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +#Если НЕ (ТонкийКлиент ИЛИ ВебКлиент) Тогда + +&Вместо("СохраненныеБезопасныеДанные") +Функция ЮТСохраненныеБезопасныеДанные(Владелец, Знач Ключи) Экспорт + + // Собираем параметры в массив + ПараметрыМетода = Мокито.МассивПараметров(Владелец, Ключи); + + // Отправляем данные на анализ + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(Справочники.ИсточникиДанных, "СохраненныеБезопасныеДанные", ПараметрыМетода, ПрерватьВыполнение); + + // Обрабатываем результат анализа + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(Владелец, Ключи); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции + +#КонецЕсли diff --git a/exts/yaxunit/src/Catalogs/ИсточникиДанных/ObjectModule.bsl b/exts/yaxunit/src/Catalogs/ИсточникиДанных/ObjectModule.bsl new file mode 100644 index 00000000..4ed5fc3f --- /dev/null +++ b/exts/yaxunit/src/Catalogs/ИсточникиДанных/ObjectModule.bsl @@ -0,0 +1,31 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +&Вместо("ПеренестиДанныеВБезопасноеХранилище") +Процедура ЮТПеренестиДанныеВБезопасноеХранилище() + + ПараметрыМетода = Новый Массив; + + ПрерватьВыполнение = Ложь; + Мокито.АнализВызова(ЭтотОбъект, "ПеренестиДанныеВБезопасноеХранилище", ПараметрыМетода, ПрерватьВыполнение); + + Если НЕ ПрерватьВыполнение Тогда + ПродолжитьВызов(); + КонецЕсли; + +КонецПроцедуры diff --git a/exts/yaxunit/src/Catalogs/ИсточникиДанных/ИсточникиДанных.mdo b/exts/yaxunit/src/Catalogs/ИсточникиДанных/ИсточникиДанных.mdo new file mode 100644 index 00000000..a24d11f4 --- /dev/null +++ b/exts/yaxunit/src/Catalogs/ИсточникиДанных/ИсточникиДанных.mdo @@ -0,0 +1,16 @@ + + + + + + + + + + ИсточникиДанных + Adopted + + Extended + Extended + + diff --git a/exts/yaxunit/src/CommonModules/Мокито/Module.bsl b/exts/yaxunit/src/CommonModules/Мокито/Module.bsl new file mode 100644 index 00000000..34ee124f --- /dev/null +++ b/exts/yaxunit/src/CommonModules/Мокито/Module.bsl @@ -0,0 +1,181 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Обучение. +// Начинает обучение мокито для регистрации правил подмены вызовов методов +// +// Параметры: +// Объект - Произвольный - Объект, методы которого хотим подменить +// +// Возвращаемое значение: +// ОбщийМодуль +// Пример: +// Для работы Мокито необходимо добавить обрабатываемые методы в расширение по следующей схеме +// +// &Вместо("ВыполнитьЗапрос") +// Функция ЮТВыполнитьЗапрос(ПараметрыПодключения, Ресурс, HTTPМетод, Параметры, ОписаниеТела, Заголовки) Экспорт +// +// ПараметрыМетода = Мокито.МассивПараметров(ПараметрыПодключения, Ресурс, HTTPМетод, Параметры, ОписаниеТела, Заголовки); +// +// ПрерватьВыполнение = Ложь; +// Результат = Мокито.АнализВызова(РаботаСHTTP, "ВыполнитьЗапрос", ПараметрыМетода, ПрерватьВыполнение); +// +// Если НЕ ПрерватьВыполнение Тогда +// Возврат ПродолжитьВызов(ПараметрыПодключения, Ресурс, HTTPМетод, Параметры, ОписаниеТела, Заголовки); +// Иначе +// Возврат Результат; +// КонецЕсли; +// +// КонецФункции +Функция Обучение(Объект) Экспорт + + Режимы = МокитоСлужебный.РежимыРаботы(); + МокитоСлужебный.УстановитьРежим(Режимы.Обучение); + + Возврат МокитоОбучение.Обучение(Объект); + +КонецФункции + +// Прогон +// Переводит мокито в режим прогона тестов +// Вызов этого метода обязателен перед выполнением тестового прогона метода +Процедура Прогон() Экспорт + + Режимы = МокитоСлужебный.РежимыРаботы(); + МокитоСлужебный.УстановитьРежим(Режимы.Тестирование); + +КонецПроцедуры + +// Проверить. +// Переводит мокито в режим проверки вызовов +// Параметры: +// Объект - Произвольный - Устанавливает проверяемый объект, вызовы методов которого будем проверять +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Проверить(Объект) Экспорт + + Режимы = МокитоСлужебный.РежимыРаботы(); + МокитоСлужебный.УстановитьРежим(Режимы.Проверка); + + Возврат МокитоПроверки.Проверить(Объект); + +КонецФункции + +// Сбросить +// Сбрасывает настройки, переинициализирует мокито +Процедура Сбросить() Экспорт + + МокитоСлужебный.СброситьПараметры(); + +КонецПроцедуры + +#Область КонструкторыПараметров + +// Любой параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться любой параметр +// Возвращаемое значение: +// см. МокитоСлужебный.ОписаниеМаскиПараметра +Функция ЛюбойПараметр() Экспорт + + МаскаПараметра = МокитоСлужебный.ОписаниеМаскиПараметра(МокитоСлужебный.ТипыУсловийПараметров().Любой, 0); + + Возврат МаскаПараметра; + +КонецФункции + +// Числовой параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться числовой параметр +// Возвращаемое значение: +// см. Мокито.ТипизированныйПараметр +Функция ЧисловойПараметр() Экспорт + + Возврат ТипизированныйПараметр(Тип("Число")); + +КонецФункции + +// Строковый параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться строковый параметр +// Возвращаемое значение: +// см. Мокито.ТипизированныйПараметр +Функция СтроковыйПараметр() Экспорт + + Возврат ТипизированныйПараметр(Тип("Строка")); + +КонецФункции + +// Типизированный параметр. +// Возвращает маску параметра. Используется при обучении и проверках для фильтрации входных параметров метода +// Указывает, что в метод может передаваться параметр указанного типа +// +// Параметры: +// Тип - Тип - Ограничение типа параметра +// +// Возвращаемое значение: +// см. МокитоСлужебный.ОписаниеМаскиПараметра +Функция ТипизированныйПараметр(Тип) Экспорт + + МаскаПараметра = МокитоСлужебный.ОписаниеМаскиПараметра(МокитоСлужебный.ТипыУсловийПараметров().Тип, 1); + МаскаПараметра.Вставить("Тип", Тип); + + Возврат МаскаПараметра; + +КонецФункции + +Функция МассивПараметров(Параметр1 = "_!%*", + Параметр2 = "_!%*", + Параметр3 = "_!%*", + Параметр4 = "_!%*", + Параметр5 = "_!%*", + Параметр6 = "_!%*", + Параметр7 = "_!%*", + Параметр8 = "_!%*", + Параметр9 = "_!%*", + Параметр10 = "_!%*") Экспорт + + Возврат МокитоСлужебный.МассивПараметров(Параметр1, + Параметр2, + Параметр3, + Параметр4, + Параметр5, + Параметр6, + Параметр7, + Параметр8, + Параметр9, + Параметр10); + +КонецФункции + +#КонецОбласти + +Функция АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение) Экспорт + + Возврат МокитоСлужебный.АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение); + +КонецФункции + +#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ОМ_ЮТ/ОМ_ЮТ.mdo b/exts/yaxunit/src/CommonModules/Мокито/Мокито.mdo similarity index 52% rename from exts/yaxunit/src/CommonModules/ОМ_ЮТ/ОМ_ЮТ.mdo rename to exts/yaxunit/src/CommonModules/Мокито/Мокито.mdo index 095e9d3c..96b905dc 100644 --- a/exts/yaxunit/src/CommonModules/ОМ_ЮТ/ОМ_ЮТ.mdo +++ b/exts/yaxunit/src/CommonModules/Мокито/Мокито.mdo @@ -1,9 +1,11 @@ - - ОМ_ЮТ + + Мокито ru - ЮТ + Мокито true + true + true diff --git a/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl new file mode 100644 index 00000000..9f460214 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/МокитоОбучение/Module.bsl @@ -0,0 +1,276 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Обучение. +// Начинает обучение мокито для регистрации правил подмены вызовов методов +// +// Параметры: +// Объект - Произвольный - Объект, методы которого хотим подменить +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Обучение(Объект) Экспорт + + УстановитьПараметрыОбучения(Объект); + + Возврат МокитоОбучение; + +КонецФункции + +// Наблюдать. +// +// Параметры: +// ИмяМетода - Строка - Имя метода обучаемого объекта +// - Произвольный - Вызов метода обучаемого объекта +// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода обучаемого объекта +// Варианты вызова: +// Мокито.Обучение(Произвольный).Когда(Строка, Массив); // Вызов через указание имени метода и параметров +// Мокито.Обучение(Произвольный).Когда(Произвольный); // Вызов через явное выполнение наблюдаемого метода +// +// Возвращаемое значение: +// ОбщийМодуль +// Пример: +// Мокито.Обучение(ОбщегоНазначения).Наблюдать("ЭтоДопустимоеИмяПеременной", Мокито.МассивПараметров("")); +// Мокито.Обучение(ОбщегоНазначения).Наблюдать(ОбщегоНазначения.ЭтоДопустимоеИмяПеременной("")); +Функция Наблюдать(ИмяМетода, ПараметрыВызова = Неопределено) Экспорт + + ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова); + + Возврат МокитоОбучение; + +КонецФункции + +// Когда. +// +// Параметры: +// ИмяМетода - Строка - Имя метода обучаемого объекта +// - Произвольный - Вызов метода обучаемого объекта +// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода обучаемого объекта +// Варианты вызова: +// Мокито.Обучение(Произвольный).Когда(Строка, Массив); // Вызов через указание имени метода и параметров +// Мокито.Обучение(Произвольный).Когда(Произвольный); // Вызов через явное выполнение наблюдаемого метода +// +// Возвращаемое значение: +// ОбщийМодуль +// Пример: +// Мокито.Обучение(ОбщегоНазначения).Когда("ЭтоДопустимоеИмяПеременной", Мокито.МассивПараметров("")); +// Мокито.Обучение(ОбщегоНазначения).Когда(ОбщегоНазначения.ЭтоДопустимоеИмяПеременной("")); +Функция Когда(ИмяМетода, ПараметрыВызова = Неопределено) Экспорт + + Возврат Наблюдать(ИмяМетода, ПараметрыВызова); + +КонецФункции + +// Вернуть. +// Указывает, что при соблюдении условий метод должен вернуть переданное значение +// Параметры: +// Результат - Произвольный - Результат, который должен вернуть метод +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Вернуть(Результат) Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия, Результат", МокитоСлужебный.ТипыДействийРеакций().ВернутьРезультат, Результат)); + + Возврат МокитоОбучение; + +КонецФункции + +// Выбросить исключение. +// Указывает, что при соблюдении условий метод должен выбросить исключение +// +// Параметры: +// ТекстИсключения - Строка +// +// Возвращаемое значение: +// ОбщийМодуль +Функция ВыброситьИсключение(ТекстИсключения) Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия, Ошибка", МокитоСлужебный.ТипыДействийРеакций().ВыброситьИсключение, ТекстИсключения)); + + Возврат МокитоОбучение; + +КонецФункции + +// Пропустить. +// Указывает, что при соблюдении условий метод не должен выполняться, его вызов пропускается +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Пропустить() Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия", МокитоСлужебный.ТипыДействийРеакций().Пропустить)); + + Возврат МокитоОбучение; + +КонецФункции + +// Выполнить метод. +// Указывает, что при соблюдении условий метод должен выполняться +// +// Возвращаемое значение: +// ОбщийМодуль +Функция ВыполнитьМетод() Экспорт + + ЗарегистрироватьРеакцию(Новый Структура("ТипДействия", МокитоСлужебный.ТипыДействийРеакций().ВызватьОсновнойМетод)); + + Возврат МокитоОбучение; + +КонецФункции + +// Прогон +// Переводит мокито в режим прогона тестов +// Вызов этого метода обязателен перед выполнением тестового прогона метода +Процедура Прогон() Экспорт + + Мокито.Прогон(); + +КонецПроцедуры + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +Процедура ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова) + + Объект = ОбучаемыйОбъект(); + ДанныеПерехвата = МокитоСлужебный.ДанныеПерехвата(Объект); + + Если ДанныеПерехвата = Неопределено Тогда + Сообщение = СтрШаблон("Не найдены настройки перехвата для %1. Необходимо предварительно вызвать метод Мокито.Обучение(Объект)", Объект); + ВызватьИсключение Сообщение; + КонецЕсли; + + Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда + СтруктураВызоваМетода = ИмяМетода; + Иначе + СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыВызова); + КонецЕсли; + + Методы = ДанныеПерехвата.Методы; + + Если НЕ Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда + Методы.Вставить(СтруктураВызоваМетода.ИмяМетода, ОписаниеПараметровПерехватаМетода()); + КонецЕсли; + + Реакция = СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода); + + Методы[СтруктураВызоваМетода.ИмяМетода].Реакции.Добавить(Реакция); + + ПараметрыОбучения().РеакцияТекущегоВыражения = Реакция; + +КонецПроцедуры + +Функция ОписаниеПараметровПерехватаМетода() + + Возврат Новый Структура("Реакции", Новый Массив); + +КонецФункции + +#Область Реакции + +Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода) + + Возврат Новый Структура("УсловиеРеакции, Действие", УсловиеРеакции(СтруктураВызоваМетода), Неопределено); + +КонецФункции + +Функция УсловиеРеакции(СтруктураВызоваМетода) + + Параметры = СтруктураВызоваМетода.Параметры; + + Если Параметры = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Условия = Новый Массив; + + Для Каждого Параметр Из Параметры Цикл + + Если МокитоСлужебный.ЭтоМаскаПарамера(Параметр) Тогда + + Условия.Добавить(Параметр); + + Иначе + + Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 10)); + + КонецЕсли; + + КонецЦикла; + + Возврат Условия; + +КонецФункции + +#КонецОбласти + +#Область Параметры + +Функция ОбучаемыйОбъект() + + ПараметрыОбучения = ПараметрыОбучения(); + + Возврат ПараметрыОбучения.ОбучаемыйОбъект; + +КонецФункции + +Функция ПараметрыОбучения() + + Параметры = МокитоСлужебный.Настройки().ПараметрыОбучения; + + Возврат Параметры; + +КонецФункции + +Процедура УстановитьПараметрыОбучения(Объект) + + ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения", Объект, Неопределено); + + МокитоСлужебный.Настройки().ПараметрыОбучения = ПараметрыОбучения; + МокитоСлужебный.ЗарегистрироватьПерехватОбъекта(Объект); + +КонецПроцедуры + +Процедура ЗарегистрироватьРеакцию(Действие) + + Действие.Вставить("Обработано", Ложь); + + ПараметрыОбучения().РеакцияТекущегоВыражения.Действие = Действие; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/МокитоОбучение/МокитоОбучение.mdo b/exts/yaxunit/src/CommonModules/МокитоОбучение/МокитоОбучение.mdo new file mode 100644 index 00000000..bbbbe02f --- /dev/null +++ b/exts/yaxunit/src/CommonModules/МокитоОбучение/МокитоОбучение.mdo @@ -0,0 +1,11 @@ + + + МокитоОбучение + + ru + Мокито обучение + + true + true + true + diff --git a/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl new file mode 100644 index 00000000..1b809283 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/МокитоПроверки/Module.bsl @@ -0,0 +1,272 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +/////////////////////////////////////////////////////////////////// +// ПрограммныйИнтерфейс +// Экспортные процедуры и функции для прикладного использования +/////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +// Проверить. +// Переводит мокито в режим проверки вызовов +// Параметры: +// Объект - Произвольный - Устанавливает проверяемый объект, вызовы методов которого будем проверять +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Проверить(Объект) Экспорт + + УстановитьПараметрыПроверки(Объект); + Возврат МокитоПроверки; + +КонецФункции + +// Количество вызовов. +// Считает вызовы метода по переданным параметрам +// Параметры: +// ИмяМетода - Строка - Имя метода проверяемого объекта +// - Произвольный - Вызов метода проверяемого объекта +// ПараметрыВызова - Массив из Произвольный - Параметры вызова метода проверяемого объекта, необходим при указании имени метода +// Возвращаемое значение: +// ОбщийМодуль +Функция КоличествоВызовов(ИмяМетода = Неопределено, ПараметрыВызова = Неопределено) Экспорт + + Параметры = ПараметрыПроверки(); + + Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда + СтруктураВызоваМетода = ИмяМетода; + Иначе + СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова); + КонецЕсли; + + Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда + ВызватьИсключение "Установлен другой проверяемый объект"; + КонецЕсли; + + Параметры.СтруктураВызоваМетода = СтруктураВызоваМетода; + + Возврат МокитоПроверки; + +КонецФункции + +// Равно. +// Проверяет подобранные вызовы. Их количество должно быть равно переданному значение, иначе вызывается исключение +// Параметры: +// Количество - Число - Ожидаемое количество вызовов +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Равно(Количество, Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .ИмеетДлину(Количество); + + Возврат МокитоПроверки; + +КонецФункции + +// Больше. +// Проверяет подобранные вызовы. Их количество должно быть больше переданного значения, иначе вызывается исключение +// Параметры: +// Количество - Число +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Больше(Количество, Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .ИмеетДлинуБольше(Количество); + + Возврат МокитоПроверки; + +КонецФункции + +// Меньше. +// Проверяет подобранные вызовы. Их количество должно быть меньше переданного значения, иначе вызывается исключение +// Параметры: +// Количество - Число +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Меньше(Количество, Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .ИмеетДлинуМеньше(Количество); + + Возврат МокитоПроверки; + +КонецФункции + +// Заполнено. +// Проверяет, что есть вызовы метода, соответствующие условию +// Параметры: +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Заполнено(Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(Истина); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .Заполнено(); + + Возврат МокитоПроверки; + +КонецФункции + +// Пусто. +// Проверяет, что нет вызовов метода, соответствующих условию +// Параметры: +// Описание - Строка - Описание проверки, необходимо для идентификации упавшей проверки +// +// Возвращаемое значение: +// ОбщийМодуль +Функция Пусто(Знач Описание = Неопределено) Экспорт + + Статистика = СтатистикаВызовов(Истина); + ЮТУтверждения + .Что(Статистика, Описание) + .ИмеющееПредставление(ОписаниеПроверяемогоОбъекта()) + .НеЗаполнено(); + + Возврат МокитоПроверки; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#Область Параметры + +// Параметры проверки. +// +// Возвращаемое значение: +// Структура: +// * ПроверяемыйОбъект - Произвольный +// * СтруктураВызоваМетода - см. МокитоСлужебный.СтруктураВызоваМетода +Функция ПараметрыПроверки() + + Параметры = МокитоСлужебный.Настройки().ПараметрыПроверки; + + Возврат Параметры; + +КонецФункции + +Процедура УстановитьПараметрыПроверки(Объект = Неопределено, СтруктураВызоваМетода = Неопределено) + + ПараметрыОбучения = Новый Структура("ПроверяемыйОбъект, СтруктураВызоваМетода", Объект, СтруктураВызоваМетода); + + МокитоСлужебный.Настройки().ПараметрыПроверки = ПараметрыОбучения; + +КонецПроцедуры + +#КонецОбласти + +Функция СтатистикаВызовов(Первый = Ложь) + + Параметры = ПараметрыПроверки(); + СтруктураВызоваМетода = Параметры.СтруктураВызоваМетода; + + ВызовыМетода = МокитоСлужебный.СтатистикаВызовов(СтруктураВызоваМетода.Объект, СтруктураВызоваМетода.ИмяМетода); + + Если ВызовыМетода = Неопределено Тогда + Возврат Новый Массив(); + КонецЕсли; + + Если ЗначениеЗаполнено(СтруктураВызоваМетода.Параметры) Тогда + + Результат = Новый Массив(); + + Для Каждого ВызовМетода Из ВызовыМетода Цикл + + Если ВызовМетода.Параметры.Количество() < СтруктураВызоваМетода.Параметры.Количество() Тогда + ВызватьИсключение "Сигнатура метода содержит меньше параметров"; + КонецЕсли; + + КоличествоПараметров = СтруктураВызоваМетода.Параметры.Количество(); + Успешно = Истина; + + Для Инд = 0 По КоличествоПараметров - 1 Цикл + + Параметр = ВызовМетода.Параметры[Инд]; + Условие = СтруктураВызоваМетода.Параметры[Инд]; + + Если МокитоСлужебный.ЭтоМаскаПарамера(Условие) Тогда + Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие); + Иначе + Успешно = Параметр = Условие; + КонецЕсли; + + Если НЕ Успешно Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если Успешно Тогда + Результат.Добавить(ВызовМетода); + Если Первый Тогда + Прервать; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ВызовыМетода = Результат; + + КонецЕсли; + + Возврат ВызовыМетода; + +КонецФункции + +Функция ОписаниеПроверяемогоОбъекта() + + СтруктураВызоваМетода = ПараметрыПроверки().СтруктураВызоваМетода; + Объект = СтруктураВызоваМетода.Объект; + ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗнч(Объект)); + Возврат СтрШаблон(" - вызовы метода `%1(%2).%3`,", Объект, ПредставлениеТипа, СтруктураВызоваМетода.ИмяМетода); + +КонецФункции + +#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/МокитоПроверки/МокитоПроверки.mdo b/exts/yaxunit/src/CommonModules/МокитоПроверки/МокитоПроверки.mdo new file mode 100644 index 00000000..cbc12b54 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/МокитоПроверки/МокитоПроверки.mdo @@ -0,0 +1,11 @@ + + + МокитоПроверки + + ru + Мокито проверки + + true + true + true + diff --git a/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl new file mode 100644 index 00000000..7d1bc49d --- /dev/null +++ b/exts/yaxunit/src/CommonModules/МокитоСлужебный/Module.bsl @@ -0,0 +1,581 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции для служебного использования внутри подсистемы +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Функция Включен() Экспорт + + Возврат ЮТКонтекст.ДанныеКонтекста() <> Неопределено; + +КонецФункции + +Процедура УстановитьРежим(Режим) Экспорт + + Контекст = Настройки(); + Контекст.Режим = Режим; + ОчиститьСлужебныеПараметры(); + +КонецПроцедуры + +Функция Настройки() Экспорт + + Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек()); + + Если Настройки = Неопределено Тогда + ВызватьИсключение "Что-то пошло не так, настройки Мокито не инициализированы"; + КонецЕсли; + + Возврат Настройки; + +КонецФункции + +#Область СтруктурыДанных + +Функция РежимыРаботы() Экспорт + + Режимы = Новый Структура(); + Режимы.Вставить("Обучение", "Обучение"); + Режимы.Вставить("Тестирование", "Тестирование"); + Режимы.Вставить("Проверка", "Проверка"); + + Возврат Новый ФиксированнаяСтруктура(Режимы); + +КонецФункции + +Функция ТипыДействийРеакций() Экспорт + + ТипыРеакций = Новый Структура(); + ТипыРеакций.Вставить("ВернутьРезультат", "ВернутьРезультат"); + ТипыРеакций.Вставить("ВыброситьИсключение", "ВыброситьИсключение"); + ТипыРеакций.Вставить("Пропустить", "Пропустить"); + ТипыРеакций.Вставить("ВызватьОсновнойМетод", "ВызватьОсновнойМетод"); + + Возврат Новый ФиксированнаяСтруктура(ТипыРеакций); + +КонецФункции + +#КонецОбласти + +Функция АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение) Экспорт + + ПрерватьВыполнение = Ложь; + + Если НЕ Включен() Тогда + Возврат Неопределено; + КонецЕсли; + + Настройки = Настройки(); + + ПараметрыПерехвата = ДанныеПерехвата(Объект); + + Если ПараметрыПерехвата = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + РежимыРаботы = РежимыРаботы(); + + СтруктураВызоваМетода = СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыМетода); + + Если Настройки.Режим = РежимыРаботы.Обучение ИЛИ Настройки.Режим = РежимыРаботы.Проверка Тогда + + ПрерватьВыполнение = Истина; + Возврат СтруктураВызоваМетода; + + ИначеЕсли Настройки.Режим = РежимыРаботы.Тестирование Тогда + + ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода); + Возврат ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение); + + КонецЕсли; + +КонецФункции + +// Структура вызова метода. +// +// Параметры: +// Объект - Произвольный - Объект, которому принадлежит метод +// ИмяМетода - Строка - Имя вызванного метода +// ПараметрыМетода - Массив из Произвольный - Набор параметров, с которыми был вызван метод +// +// Возвращаемое значение: +// Структура - Информация о вызове метода: +// * Объект - Произвольный - Объект, которому принадлежит метод +// * ИмяМетода - Строка - Имя вызванного метода +// * Параметры - Массив из Произвольный - Набор параметров, с которыми был вызван метод +// * Контекст - Строка - Контекст вызова метода +Функция СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыМетода) Экспорт + + Если ЭтоСтруктураВызоваМетода(Объект) Тогда + Возврат Объект; + КонецЕсли; + + СтруктураВызоваМетода = Новый Структура("Объект, ИмяМетода, Параметры", Объект, ИмяМетода, ПараметрыМетода); + СтруктураВызоваМетода.Вставить("Контекст"); + + Возврат СтруктураВызоваМетода; + +КонецФункции + +Функция ЭтоСтруктураВызоваМетода(Объект) Экспорт + + Возврат ТипЗнч(Объект) = Тип("Структура"); + +КонецФункции + +#Область Предикаты + +Функция ТипыУсловийПараметров() Экспорт + + Типы = Новый Структура; + Типы.Вставить("Любой", "Любой"); + Типы.Вставить("Значение", "Значение"); + Типы.Вставить("Тип", "Тип"); + Типы.Вставить("ОписаниеТипа", "ОписаниеТипа"); + + Возврат Новый ФиксированнаяСтруктура(Типы); + +КонецФункции + +Функция ОписаниеМаскиПараметра(ТипУсловия, Приоритет) Экспорт + + МаскаПараметра = Новый Структура("МаскаСопоставленияПараметров", Истина); + МаскаПараметра.Вставить("Режим", ТипУсловия); + МаскаПараметра.Вставить("Приоритет", Приоритет); + + Возврат МаскаПараметра; + +КонецФункции + +Функция ЭтоМаскаПарамера(Параметр) Экспорт + + Возврат ТипЗнч(Параметр) = Тип("Структура") И Параметр.Свойство("МаскаСопоставленияПараметров") И Параметр.МаскаСопоставленияПараметров; + +КонецФункции + +Функция ПроверитьПараметр(Параметр, Условие) Экспорт + + ТипыУсловий = ТипыУсловийПараметров(); + Совпадает = Ложь; + + Если Условие.Режим = ТипыУсловий.Любой Тогда + + Совпадает = Истина; + + ИначеЕсли Условие.Режим = ТипыУсловий.Значение Тогда + + Совпадает = Условие.Значение = Параметр; + + ИначеЕсли Условие.Режим = ТипыУсловий.Тип Тогда + + Совпадает = Условие.Тип = ТипЗнч(Параметр); + + ИначеЕсли Условие.Режим = ТипыУсловий.ОписаниеТипа Тогда + + Совпадает = Условие.Тип.СодержитТип(ТипЗнч(Параметр)); + + КонецЕсли; + + Возврат Совпадает; + +КонецФункции + +#КонецОбласти + +#Область Перехват + +Функция ПараметрыПерехвата() Экспорт + + Возврат Настройки().Перехват; + +КонецФункции + +// Данные перехвата. +// +// Параметры: +// Объект - Произвольный +// +// Возвращаемое значение: +// см. МокитоСлужебный.ОписаниеПараметровПерехватаОбъекта +Функция ДанныеПерехвата(Объект) Экспорт + + ПараметрыПерехвата = ПараметрыПерехвата(); + + Если ТипЗнч(Объект) = Тип("Структура") Тогда + Ключ = Объект.Объект; + Иначе + Ключ = Объект; + КонецЕсли; + + ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ]; + + Если ПараметрыПерехватаОбъекта = Неопределено И ЭтоОбъект(Ключ) Тогда + ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ.Ссылка]; + КонецЕсли; + + Возврат ПараметрыПерехватаОбъекта; + +КонецФункции + +Процедура ЗарегистрироватьПерехватОбъекта(Знач Объект) Экспорт + + Если ЭтоОбъект(Объект) Тогда + Объект = Объект.Ссылка; + КонецЕсли; + + ПараметрыПерехвата = ПараметрыПерехвата(); + ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект)); + +КонецПроцедуры + +Функция ОписаниеПараметровПерехватаОбъекта(Объект) Экспорт + + Возврат Новый Структура("Объект, Методы", Объект, Новый Структура); + +КонецФункции + +#КонецОбласти + +Функция СтатистикаВызовов(Знач Объект, ИмяМетода) Экспорт + + Если ЭтоОбъект(Объект) Тогда + Объект = Объект.Ссылка; + КонецЕсли; + + Статистика = Настройки().Статистика.Вызовы[Объект]; + + Если Статистика = Неопределено ИЛИ НЕ Статистика.Свойство(ИмяМетода) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Статистика[ИмяМетода]; + +КонецФункции + +#Область ОбработчикиСобытий + +Процедура ПередТестом(ОписаниеСобытия) Экспорт + + ИнициализироватьНастройки(); + +КонецПроцедуры + +Процедура ПослеТеста(ОписаниеСобытия) Экспорт + + ОчиститьНастройки(); + +КонецПроцедуры + +#КонецОбласти + +Функция МассивПараметров(Параметр1 = "_!%*", + Параметр2 = "_!%*", + Параметр3 = "_!%*", + Параметр4 = "_!%*", + Параметр5 = "_!%*", + Параметр6 = "_!%*", + Параметр7 = "_!%*", + Параметр8 = "_!%*", + Параметр9 = "_!%*", + Параметр10 = "_!%*") Экспорт + + ФлагКонец = "_!%*"; + + Параметры = Новый Массив; + + Если Параметр1 <> ФлагКонец Тогда + Параметры.Добавить(Параметр1); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр2 <> ФлагКонец Тогда + Параметры.Добавить(Параметр2); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр3 <> ФлагКонец Тогда + Параметры.Добавить(Параметр3); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр4 <> ФлагКонец Тогда + Параметры.Добавить(Параметр4); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр5 <> ФлагКонец Тогда + Параметры.Добавить(Параметр5); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр6 <> ФлагКонец Тогда + Параметры.Добавить(Параметр6); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр7 <> ФлагКонец Тогда + Параметры.Добавить(Параметр7); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр8 <> ФлагКонец Тогда + Параметры.Добавить(Параметр8); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр9 <> ФлагКонец Тогда + Параметры.Добавить(Параметр9); + Иначе + Возврат Параметры; + КонецЕсли; + + Если Параметр10 <> ФлагКонец Тогда + Параметры.Добавить(Параметр10); + Иначе + Возврат Параметры; + КонецЕсли; + + Возврат Параметры; + +КонецФункции + +#КонецОбласти + +///////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции, составляющие внутреннюю реализацию модуля +///////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +#Область ОбработкаВызовов + +// Зарегистрировать вызов метода. +// +// Параметры: +// Настройки - см. ИнициализироватьНастройки +// ПараметрыПерехвата - см. ДанныеПерехвата +// СтруктураВызоваМетода - см. СтруктураВызоваМетода +Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода) + + Объект = ПараметрыПерехвата.Объект; + ИмяМетода = СтруктураВызоваМетода.ИмяМетода; + Статистика = Настройки.Статистика.Вызовы[Объект]; + + Если Статистика = Неопределено Тогда + + Статистика = Новый Структура; + Настройки.Статистика.Вызовы.Вставить(Объект, Статистика); + + КонецЕсли; + + Если НЕ Статистика.Свойство(ИмяМетода) Тогда + + Статистика.Вставить(ИмяМетода, Новый Массив); + + КонецЕсли; + + Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода); + +КонецПроцедуры + +Функция ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение) + + Если НЕ ПараметрыПерехвата.Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыПерехватаМетода = ПараметрыПерехвата.Методы[СтруктураВызоваМетода.ИмяМетода]; + + Реакция = НайтиРеакцию(ПараметрыПерехватаМетода, СтруктураВызоваМетода); + + Если Реакция = Неопределено ИЛИ Реакция.Действие = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ПрерватьВыполнение = Истина; + + ТипыДействий = ТипыДействийРеакций(); + + Если Реакция.Действие.ТипДействия = ТипыДействий.ВернутьРезультат Тогда + + Реакция.Действие.Обработано = Истина; + Возврат Реакция.Действие.Результат; + + ИначеЕсли Реакция.Действие.ТипДействия = ТипыДействий.ВыброситьИсключение Тогда + + Реакция.Действие.Обработано = Истина; + ВызватьИсключение Реакция.Действие.Ошибка; + + ИначеЕсли Реакция.Действие.ТипДействия = ТипыДействий.Пропустить Тогда + + Реакция.Действие.Обработано = Истина; + Возврат Неопределено; + + ИначеЕсли Реакция.Действие.ТипДействия = ТипыДействий.ВызватьОсновнойМетод Тогда + + Реакция.Действие.Обработано = Истина; + ПрерватьВыполнение = Ложь; + + Иначе + + ВызватьИсключение "Неизвестный тип действия реакции"; + + КонецЕсли; + +КонецФункции + +#КонецОбласти + +Функция НайтиРеакцию(ПараметрыПерехватаМетода, СтруктураВызоваМетода) + + Реакция = Неопределено; + Приоритет = 0; + ПараметрыВызова = СтруктураВызоваМетода.Параметры; + + Для Каждого ВозможнаяРеакция Из ПараметрыПерехватаМетода.Реакции Цикл + + ПриоритетВозможнойРеакции = ПроверитьРеакцию(ВозможнаяРеакция, ПараметрыВызова); + + Если ПриоритетВозможнойРеакции > Приоритет Тогда + + Реакция = ВозможнаяРеакция; + Приоритет = ПриоритетВозможнойРеакции; + + КонецЕсли; + + КонецЦикла; + + Возврат Реакция; + +КонецФункции + +Функция ПроверитьРеакцию(Реакция, ПараметрыМетода) + + Приоритет = 1; + + Если Реакция.УсловиеРеакции = Неопределено Тогда + Возврат Приоритет; + КонецЕсли; + + Для Инд = 0 По Реакция.УсловиеРеакции.ВГраница() Цикл + + Если НЕ ПроверитьПараметр(ПараметрыМетода[Инд], Реакция.УсловиеРеакции[Инд]) Тогда + + Возврат 0; + + КонецЕсли; + + Приоритет = Приоритет + Реакция.УсловиеРеакции[Инд].Приоритет; + + КонецЦикла; + + Возврат Приоритет; + +КонецФункции + +#Область Настройки + +Процедура ИнициализироватьНастройки() Экспорт + + Настройки = Новый Структура; + Настройки.Вставить("Метод"); + Настройки.Вставить("Реакция"); + Настройки.Вставить("Настройки"); + Настройки.Вставить("Перехват", Новый Соответствие); + Настройки.Вставить("Режим", "НеУстановлен"); + Настройки.Вставить("Статистика", Новый Структура("Вызовы", Новый Соответствие)); + + Настройки.Вставить("ПараметрыОбучения", Неопределено); + Настройки.Вставить("ПараметрыПроверки", Неопределено); + + ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Настройки); + +КонецПроцедуры + +Процедура ОчиститьНастройки() Экспорт + + ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Неопределено); + +КонецПроцедуры + +Процедура СброситьПараметры() Экспорт + + ИнициализироватьНастройки(); + +КонецПроцедуры + +Функция КлючНастроек() + + Возврат "Mockito"; + +КонецФункции + +Процедура ОчиститьСлужебныеПараметры() + + Настройки = Настройки(); + + Настройки.ПараметрыОбучения = Неопределено; + Настройки.ПараметрыПроверки = Неопределено; + +КонецПроцедуры + +#КонецОбласти + +Функция ЭтоСсылка(Значение) Экспорт + + Если Значение <> Неопределено Тогда + + ТипыСсылок = ОбщегоНазначенияКлиентСервер.ПолучитьОписаниеТиповЛюбаяСсылка(); + Результат = ТипыСсылок.СодержитТип(ТипЗнч(Значение)); + + Иначе + + Результат = Ложь; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ЭтоОбъект(Значение) Экспорт + + Если Значение <> Неопределено И ОбщегоНазначенияКлиентСервер.ПеременнаяСодержитСвойство(Значение, "Ссылка") Тогда + + Возврат ЭтоСсылка(Значение.Ссылка); + + Иначе + + Результат = Ложь; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/МокитоСлужебный/МокитоСлужебный.mdo b/exts/yaxunit/src/CommonModules/МокитоСлужебный/МокитоСлужебный.mdo new file mode 100644 index 00000000..d562e123 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/МокитоСлужебный/МокитоСлужебный.mdo @@ -0,0 +1,11 @@ + + + МокитоСлужебный + + ru + Мокито служебный + + true + true + true + diff --git a/exts/yaxunit/src/CommonModules/ОМ_Мокито/Module.bsl b/exts/yaxunit/src/CommonModules/ОМ_Мокито/Module.bsl new file mode 100644 index 00000000..041b1f02 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/ОМ_Мокито/Module.bsl @@ -0,0 +1,182 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +// @strict-types + +///////////////////////////////////////////////////////////////////////////////// +// Экспортные процедуры и функции, предназначенные для использования другими +// объектами конфигурации или другими программами +///////////////////////////////////////////////////////////////////////////////// +#Область ТестыAPI + +Процедура ИсполняемыеСценарии() Экспорт + + ЮТТесты + .Тест("Обучение") + .Тест("Проверить") + .Тест("МокированиеМетодовСсылочныхОбъектов") + .Тест("НастройкаСерверныхМоковСКлиента") + ; + +КонецПроцедуры + +#КонецОбласти + +#Область Тесты + +Процедура Обучение() Экспорт + + Описание = "Обучение через явный вызов метода"; + Мокито.Обучение(РаботаСHTTP) + .Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Мокито.ЛюбойПараметр(), Мокито.ЛюбойПараметр())) + .Вернуть(1) + .Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2)) + .Вернуть(10) + .Прогон(); + + ЮТУтверждения.Что(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2), Описание + ". Кейс 1") + .Равно(10); + ЮТУтверждения.Что(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 1), Описание + ". Кейс 2") + .Равно(1); + + Описание = "Обучение через указание имени и набора параметров"; + Мокито.Обучение(РаботаСHTTP) + .Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Мокито.ЛюбойПараметр(), Мокито.ЛюбойПараметр())) + .Вернуть(20) + .Когда("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(Справочники.ИсточникиДанных.FTP, 2)) + .Вернуть(2) + .Прогон(); + + ЮТУтверждения.Что(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2), Описание + ". Кейс 1") + .Равно(2); + ЮТУтверждения.Что(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 1), Описание + ". Кейс 2") + .Равно(20); + +КонецПроцедуры + +Процедура Проверить() Экспорт + + ЛюбойПараметр = Мокито.ЛюбойПараметр(); + ТипИсточникДанных = Тип("СправочникСсылка.ИсточникиДанных"); + + Мокито.Обучение(РаботаСHTTP) + .Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(ЛюбойПараметр, ЛюбойПараметр)) + .Вернуть(1) + .Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2)) + .Вернуть(10) + .Прогон(); + + РаботаСHTTP.ОтправитьОбъектНаСервер("Справочники.ИсточникиДанных.FTP", Неопределено); + РаботаСHTTP.ОтправитьОбъектНаСервер(Справочники.ИсточникиДанных.FTP, 2); + РаботаСHTTP.ОтправитьОбъектНаСервер(1, 2); + + Мокито.Проверить(РаботаСHTTP) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(ЛюбойПараметр, Мокито.ЧисловойПараметр())).Больше(1).Равно(2) + .КоличествоВызовов("ОтправитьОбъектНаСервер").Заполнено().Равно(3).Меньше(6) + .КоличествоВызовов("ОтправитьЗапросHTTP").Пусто().Меньше(1) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(1, 2)).Равно(1) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(ЛюбойПараметр, ЛюбойПараметр)).Равно(3) + .КоличествоВызовов(РаботаСHTTP.ОтправитьОбъектНаСервер(Мокито.ТипизированныйПараметр(ТипИсточникДанных), ЛюбойПараметр)).Равно(1) + ; + +КонецПроцедуры + +Процедура МокированиеМетодовСсылочныхОбъектов() Экспорт + + Результат = Новый УникальныйИдентификатор(); + // Мокирование обработки проведения (выключение алгоритма проведения) + Документ = ЮТТестовыеДанные.СоздатьДокумент(Документы.ЧекККМ); + Мокито.Обучение(Документ) + .Когда("ОбработкаПроведения").Пропустить() + .Прогон(); + Объект = Документ.ПолучитьОбъект(); + Объект.ВОжидании = Истина; + Объект.Записать(РежимЗаписиДокумента.Проведение); + + Мокито.Проверить(Объект).КоличествоВызовов("ОбработкаПроведения").Заполнено(); + Мокито.Проверить(Документ).КоличествоВызовов("ОбработкаПроведения").Заполнено(); + + Справочник = ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ДополнительныеПараметрыЖурналаДействийПользователя); + СправочникОбъект = Справочник.ПолучитьОбъект(); + + // Мокирование экспортного метода объекта, указание имени метода + Описание = "Мокирование экспортного метода объекта, указание имени метода"; + Мокито.Обучение(Справочник) + .Когда("ПолучитьСтруктуруИзХранилища").Вернуть(Результат) + .Прогон(); + + ЮТУтверждения.Что(СправочникОбъект.ПолучитьСтруктуруИзХранилища(), Описание) + .Равно(Результат); + + Мокито.Проверить(Справочник).КоличествоВызовов("ПолучитьСтруктуруИзХранилища").Заполнено(); + + // Мокирование экспортного метода объекта, явный вызов метода + Мокито.Сбросить(); + Описание = "Мокирование экспортного метода объекта, явный вызов метода"; + Мокито.Обучение(СправочникОбъект) + .Когда(СправочникОбъект.ПолучитьСтруктуруИзХранилища()).Вернуть(Результат) + .Прогон(); + + ЮТУтверждения.Что(Справочник.ПолучитьОбъект().ПолучитьСтруктуруИзХранилища(), Описание) + .Равно(Результат); + + Мокито.Проверить(Справочник).КоличествоВызовов("ПолучитьСтруктуруИзХранилища").Заполнено(Описание); + + // Мокирование приватного метода + Мокито.Сбросить(); + Описание = "Мокирование приватного метода"; + Справочник = ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ИсточникиДанных); + СправочникОбъект = Справочник.ПолучитьОбъект(); + Пароль = "123"; + Пользователь = "админ"; + + СправочникОбъект.Пользователь = Пользователь; + СправочникОбъект.Пароль = Пароль; + СправочникОбъект.Записать(); + ЮТУтверждения.Что(СправочникОбъект, Описание + ". До мокирования") + .Свойство("Пользователь").Равно(Пользователь) + .Свойство("Пароль").НеЗаполнено(); + + Мокито.Обучение(СправочникОбъект) + .Когда("ПеренестиДанныеВБезопасноеХранилище").Пропустить() + .Прогон(); + + СправочникОбъект.Пользователь = Пользователь; + СправочникОбъект.Пароль = Пароль; + СправочникОбъект.Записать(); + ЮТУтверждения.Что(СправочникОбъект, Описание + ". После мокирования") + .Свойство("Пользователь").Равно(Пользователь) + .Свойство("Пароль").Равно(Пароль); + + // Мокирование модуля менеджера + Мокито.Сбросить(); + Описание = "Мокирование модуля менеджера"; + Мокито.Обучение(Справочники.ИсточникиДанных) + .Когда(Справочники.ИсточникиДанных.СохраненныеБезопасныеДанные(Справочник)).Вернуть(Результат) + .Прогон(); + + ЮТУтверждения.Что(Справочники.ИсточникиДанных.СохраненныеБезопасныеДанные(Справочник), Описание) + .Равно(Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ОМ_Мокито/ОМ_Мокито.mdo b/exts/yaxunit/src/CommonModules/ОМ_Мокито/ОМ_Мокито.mdo new file mode 100644 index 00000000..cda5e6d2 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/ОМ_Мокито/ОМ_Мокито.mdo @@ -0,0 +1,9 @@ + + + ОМ_Мокито + + ru + О м мокито + + true + diff --git a/exts/yaxunit/src/CommonModules/ОМ_ЮТ/Module.bsl b/exts/yaxunit/src/CommonModules/ОМ_МокитоОбучение/Module.bsl similarity index 51% rename from exts/yaxunit/src/CommonModules/ОМ_ЮТ/Module.bsl rename to exts/yaxunit/src/CommonModules/ОМ_МокитоОбучение/Module.bsl index ebc73394..783419b5 100644 --- a/exts/yaxunit/src/CommonModules/ОМ_ЮТ/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ОМ_МокитоОбучение/Module.bsl @@ -24,33 +24,39 @@ ///////////////////////////////////////////////////////////////////////////////// #Область ТестыAPI -Процедура ИсполняемыеСценарии() Экспорт +Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт ЮТТесты - .ТестКлиент("ВыполнитьМодульноеТестирование"); - + .Тест("ВыброситьИсключение") + ; + КонецПроцедуры #КонецОбласти #Область Тесты -Процедура ВыполнитьМодульноеТестирование() Экспорт +Процедура ВыброситьИсключение() Экспорт - ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска(); - ПараметрыЗапуска.CloseAfterTests = Ложь; - ПараметрыЗапуска.filter.extensions = ЮТОбщий.ЗначениеВМассиве("tests"); - ПараметрыЗапуска.ВыполнятьМодульноеТестирование = Истина; + ИсточникДанных = ПредопределенноеЗначение("Справочник.ИсточникиДанных.FTP"); - ЮТУтверждения.Что(ЮТ, "Не указан каталог отчетов") - .Метод("ВыполнитьМодульноеТестирование").Параметр(ПараметрыЗапуска) - .ВыбрасываетИсключение("Не указан путь сохранения отчета"); - - ПараметрыЗапуска.reportPath = ЮТТестовыеДанные.НовыйФайл(); - ЮТУтверждения.Что(ЮТ, "Указан каталог отчетов") - .Метод("ВыполнитьМодульноеТестирование").Параметр(ПараметрыЗапуска) - .НеВыбрасываетИсключение(); + Мокито.Обучение(РаботаСHTTP) + .Когда("ОтправитьОбъектНаСервер") + .ВыброситьИсключение("Не верные параметры вызова") + .Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(ИсточникДанных, Мокито.ЛюбойПараметр())) + .Вернуть(1) + .Прогон(); + + ЮТУтверждения.Что(РаботаСHTTP) + .Метод("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(ИсточникДанных, 1)) + .НеВыбрасываетИсключение() + .Метод("ОтправитьОбъектНаСервер", Мокито.МассивПараметров(1, 1)) + .ВыбрасываетИсключение("Не верные параметры вызова"); КонецПроцедуры #КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ОМ_МокитоОбучение/ОМ_МокитоОбучение.mdo b/exts/yaxunit/src/CommonModules/ОМ_МокитоОбучение/ОМ_МокитоОбучение.mdo new file mode 100644 index 00000000..065bc784 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/ОМ_МокитоОбучение/ОМ_МокитоОбучение.mdo @@ -0,0 +1,9 @@ + + + ОМ_МокитоОбучение + + ru + Мокито обучение + + true + diff --git a/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl b/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl index 84fccdb8..91691007 100644 --- a/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl @@ -112,7 +112,7 @@ Ошибка = ИнформацияОбОшибке(); КонецПопытки; ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `Структура` содержит свойство `ЧужоеСвойство`, но это не так"); - ПроверитьДанныеОшибкиСравнения(Неопределено, "ЧужоеСвойство"); + ПроверитьДанныеОшибкиСравнения(Объект, "ЧужоеСвойство"); Попытка Ошибка = Неопределено; diff --git a/exts/yaxunit/src/CommonModules/РаботаСHTTP/Module.bsl b/exts/yaxunit/src/CommonModules/РаботаСHTTP/Module.bsl new file mode 100644 index 00000000..1ab92e66 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/РаботаСHTTP/Module.bsl @@ -0,0 +1,52 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +&Вместо("ОтправитьОбъектНаСервер") +Функция ЮТОтправитьОбъектНаСервер(ИсточникДанных, Объект, HTTPМетод, ТипКонтента, Преобразование, ДопНастройки, Ответ, ОтветВСтруктуру, ТелоОтветаВХранилище) Экспорт + + // Собираем параметры в массив + ПараметрыМетода = Мокито.МассивПараметров(ИсточникДанных, Объект, HTTPМетод, ТипКонтента, Преобразование, ДопНастройки, Ответ, ОтветВСтруктуру, ТелоОтветаВХранилище); + + // Отправляем данные на анализ + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(РаботаСHTTP, "ОтправитьОбъектНаСервер", ПараметрыМетода, ПрерватьВыполнение); + + // Обрабатываем результат анализа + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(ИсточникДанных, Объект, HTTPМетод, ТипКонтента, Преобразование, ДопНастройки, Ответ, ОтветВСтруктуру, ТелоОтветаВХранилище); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции + +&Вместо("ОтправитьЗапросHTTP") +Функция ЮТОтправитьЗапросHTTP(ИсточникДанных, HTTPМетод, АдресСкрипта, СтруктураТела, Ответ, СтруктураАвторизации, Параметры, Заголовки, ОтветВСтруктуру, ТелоОтветаВХранилище) Экспорт + + ПараметрыМетода = Мокито.МассивПараметров(ИсточникДанных, HTTPМетод, АдресСкрипта, СтруктураТела, Ответ, СтруктураАвторизации, Параметры, Заголовки, ОтветВСтруктуру, ТелоОтветаВХранилище); + + ПрерватьВыполнение = Ложь; + Результат = Мокито.АнализВызова(РаботаСHTTP, "ОтправитьЗапросHTTP", ПараметрыМетода, ПрерватьВыполнение); + + Если НЕ ПрерватьВыполнение Тогда + Возврат ПродолжитьВызов(ИсточникДанных, HTTPМетод, АдресСкрипта, СтруктураТела, Ответ, СтруктураАвторизации, Параметры, Заголовки, ОтветВСтруктуру, ТелоОтветаВХранилище); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции diff --git a/exts/yaxunit/src/CommonModules/РаботаСHTTP/РаботаСHTTP.mdo b/exts/yaxunit/src/CommonModules/РаботаСHTTP/РаботаСHTTP.mdo new file mode 100644 index 00000000..c228b9e5 --- /dev/null +++ b/exts/yaxunit/src/CommonModules/РаботаСHTTP/РаботаСHTTP.mdo @@ -0,0 +1,17 @@ + + + РаботаСHTTP + Adopted + + Extended + Checked + Checked + Checked + Checked + Checked + Checked + + true + true + true + diff --git a/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl index 63edd818..c63a93b4 100644 --- a/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl @@ -49,6 +49,8 @@ // Массив из см. ЮТФабрика.ОписаниеМодуля - Коллекция описаний моделей, структуру элемента см. ЮТФабрика.ОписаниеМодуля Функция МодулиРасширений() Экспорт + УстановитьПривилегированныйРежим(Истина); + МетаданныеМодулей = Новый Массив; Для Каждого Модуль Из Метаданные.ОбщиеМодули Цикл diff --git a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl index ac523cb9..dc415f4d 100644 --- a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl @@ -715,6 +715,18 @@ КонецФункции +Функция ПредставлениеТипа(Тип) Экспорт + + ТипXML = СериализаторXDTO.XMLТип(Тип); + + Если ТипXML = Неопределено Тогда + Возврат ""; + Иначе + Возврат ТипXML.ИмяТипа; + КонецЕсли; + +КонецФункции + #КонецОбласти ///////////////////////////////////////////////////////////////////////////////// diff --git a/exts/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl index ad1f3fd0..49048b5c 100644 --- a/exts/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТРегистрацияОшибок/Module.bsl @@ -432,14 +432,18 @@ ВставкаСвойство = ""; КонецЕсли; - ПроверяемоеЗначение = Контекст.ПроверяемоеЗначение; + Если ЗначениеЗаполнено(Контекст.ПредставлениеПроверяемогоЗначения) Тогда + ПредставлениеЗначения = Контекст.ПредставлениеПроверяемогоЗначения; + Иначе + ПредставлениеЗначения = СтрШаблон("`%1`", Контекст.ПроверяемоеЗначение); + КонецЕсли; // Заголовок сообщения ТекстСообщения = ""; // Тело сообщения - ТекстСообщения = СтрШаблон("ожидали, что %1 `%2`%3 %4, но это не так.", + ТекстСообщения = СтрШаблон("ожидали, что %1 %2%3 %4, но это не так.", ОбъектПроверки, - ПроверяемоеЗначение, + ПредставлениеЗначения, ВставкаСвойство, ТекстОжидания); diff --git a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl index e544835f..0a0cc9f5 100644 --- a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl @@ -137,6 +137,7 @@ ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия); ВызватьОбработчикРасширения(ИмяСобытия, ОписаниеСобытия); КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl index df8a9262..819c11fa 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl @@ -38,7 +38,7 @@ Если ЗначениеЗаполнено(Наименование) Тогда Объект.Наименование = Наименование; - Иначе + ИначеЕсли Объект.Метаданные().ДлинаНаименования > 0 Тогда Объект.Наименование = Новый УникальныйИдентификатор(); КонецЕсли; @@ -59,7 +59,7 @@ // Реквизиты - Структура, Неопределено - Значения реквизитов элемента // // Возвращаемое значение: -// ЛюбаяСсылка - Ссылка на созданный объект +// ДокументСсылка - Ссылка на созданный объект Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт Объект = Менеджер.СоздатьДокумент(); diff --git a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl index ae68d238..0c736b58 100644 --- a/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТУтверждения/Module.bsl @@ -93,6 +93,13 @@ КонецФункции +Функция ИмеющееПредставление(Представление) Экспорт + + Контекст().ПредставлениеПроверяемогоЗначения = Представление; + Возврат ЮТУтверждения; + +КонецФункции + // Свойство // Проверяет наличие свойства и запоминает имя свойства для последующей проверки // Следующая проверка будет относится к этому свойству @@ -590,7 +597,7 @@ // - ТаблицаЗначения // // Параметры: -// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную дину или размер +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную длину или размер // ОписаниеПроверки - Строка - Описание конкретной проверки // // Возвращаемое значение: @@ -603,6 +610,72 @@ КонецФункции +// ИмеетДлинуБольше +// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка +// - Массив +// - Структура +// - Соответствие +// - СписокЗначений +// - ФиксированныйМассив +// - ФиксированнаяСтруктура +// - ФиксированноеСоответствие +// - ТаблицаЗначения +// +// Параметры: +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную длину или размер +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетДлинуБольше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); + + ФактическаяДлина = ДлинаПроверяемогоЗначения(); + Результат = ФактическаяДлина > ОжидаемоеЗначение; + + Сообщение = СтрШаблон("имеет длину (размер) больше `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Ложь, ФактическаяДлина, ОжидаемоеЗначение); + Возврат ЮТУтверждения; + +КонецФункции + +// ИмеетДлинуМеньше +// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции +// Проверка поддерживается для следующих типов проверяемого значения: +// - Строка +// - Массив +// - Структура +// - Соответствие +// - СписокЗначений +// - ФиксированныйМассив +// - ФиксированнаяСтруктура +// - ФиксированноеСоответствие +// - ТаблицаЗначения +// +// Параметры: +// ОжидаемоеЗначение - Число - Ожидается, что значение Контекста (или его свойство) имеет указанную длину или размер +// ОписаниеПроверки - Строка - Описание конкретной проверки +// +// Возвращаемое значение: +// ОбщийМодуль - Этот модуль для замыкания +Функция ИмеетДлинуМеньше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт + + УстановитьОписаниеПроверки(ОписаниеПроверки); + ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); + + ФактическаяДлина = ДлинаПроверяемогоЗначения(); + Результат = ФактическаяДлина < ОжидаемоеЗначение; + + Сообщение = СтрШаблон("имеет длину (размер) меньше `%1`", ОжидаемоеЗначение); + ОбработатьРезультатСравнения(Результат, Сообщение, Ложь, ФактическаяДлина, ОжидаемоеЗначение); + Возврат ЮТУтверждения; + +КонецФункции + // НеИмеетДлину // Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции, которые не должны совпадать с указанным значением // Проверка поддерживается для следующих типов проверяемого значения: @@ -748,6 +821,7 @@ Контекст = Новый Структура; Контекст.Вставить("ПроверяемоеЗначение", Неопределено); + Контекст.Вставить("ПредставлениеПроверяемогоЗначения", Неопределено); Контекст.Вставить("ПрефиксОшибки", ""); Контекст.Вставить("ИмяМетода", ""); Контекст.Вставить("ИмяСвойства", ""); @@ -1126,9 +1200,7 @@ КонецПроцедуры -Процедура ПроверитьДлину(ОжидаемоеЗначение, Реверс) - - ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); +Функция ДлинаПроверяемогоЗначения() Попытка ПроверяемоеЗначение = ПроверяемоеЗначение(); @@ -1142,11 +1214,16 @@ ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки); КонецЕсли; - Попытка - Результат = ФактическаяДлина = ОжидаемоеЗначение; - Исключение - ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке()); - КонецПопытки; + Возврат ФактическаяДлина; + +КонецФункции + +Процедура ПроверитьДлину(ОжидаемоеЗначение, Реверс) + + ПроверитьТипЗначения(ОжидаемоеЗначение, "Число"); + + ФактическаяДлина = ДлинаПроверяемогоЗначения(); + Результат = ФактическаяДлина = ОжидаемоеЗначение; Сообщение = СтрШаблон("имеет длину (размер) `%1`", ОжидаемоеЗначение); ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ФактическаяДлина, ОжидаемоеЗначение); diff --git a/exts/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl index 00fe3a55..d5ae0ec7 100644 --- a/exts/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТЧитатель/Module.bsl @@ -90,7 +90,7 @@ КонецЕсли; КонецЕсли; - + Данные = ЮТТесты.СценарииМодуля(); Если Ошибка <> Неопределено Тогда diff --git a/exts/yaxunit/src/Configuration/Configuration.mdo b/exts/yaxunit/src/Configuration/Configuration.mdo index 0954ec29..8f662eae 100644 --- a/exts/yaxunit/src/Configuration/Configuration.mdo +++ b/exts/yaxunit/src/Configuration/Configuration.mdo @@ -30,11 +30,17 @@ ru Subsystem.ЮТФункциональность - CommonModule.ОМ_ЮТ + CommonModule.Мокито + CommonModule.МокитоОбучение + CommonModule.МокитоПроверки + CommonModule.МокитоСлужебный + CommonModule.ОМ_Мокито + CommonModule.ОМ_МокитоОбучение CommonModule.ОМ_ЮТИсполнитель CommonModule.ОМ_ЮТУтверждения CommonModule.ОМ_ЮТФильтрация CommonModule.ОМ_ЮТЧитатель + CommonModule.РаботаСHTTP CommonModule.ЮТ CommonModule.ЮТИсполнитель CommonModule.ЮТИсполнительСервер @@ -59,4 +65,7 @@ CommonModule.ЮТФильтрация CommonModule.ЮТЧитатель CommonModule.ЮТЧитательСервер + Catalog.ДополнительныеПараметрыЖурналаДействийПользователя + Catalog.ИсточникиДанных + Document.ЧекККМ diff --git a/exts/yaxunit/src/Documents/ЧекККМ/ObjectModule.bsl b/exts/yaxunit/src/Documents/ЧекККМ/ObjectModule.bsl new file mode 100644 index 00000000..8664e999 --- /dev/null +++ b/exts/yaxunit/src/Documents/ЧекККМ/ObjectModule.bsl @@ -0,0 +1,31 @@ +//©///////////////////////////////////////////////////////////////////////////©// +// +// Copyright 2021-2022 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. +// +//©///////////////////////////////////////////////////////////////////////////©// + +&Вместо("ОбработкаПроведения") +Процедура ЮТОбработкаПроведения(Отказ, РежимПроведения) + + ПараметрыМетода = Мокито.МассивПараметров(Отказ, РежимПроведения); + + ПрерватьВыполнение = Ложь; + Мокито.АнализВызова(ЭтотОбъект, "ОбработкаПроведения", ПараметрыМетода, ПрерватьВыполнение); + + Если НЕ ПрерватьВыполнение Тогда + ПродолжитьВызов(Отказ, РежимПроведения); + КонецЕсли; + +КонецПроцедуры diff --git a/exts/yaxunit/src/Documents/ЧекККМ/ЧекККМ.mdo b/exts/yaxunit/src/Documents/ЧекККМ/ЧекККМ.mdo new file mode 100644 index 00000000..1972d0ea --- /dev/null +++ b/exts/yaxunit/src/Documents/ЧекККМ/ЧекККМ.mdo @@ -0,0 +1,15 @@ + + + + + + + + + + ЧекККМ + Adopted + + Extended + + diff --git a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo index d534d332..f83fad12 100644 --- a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo +++ b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo @@ -7,6 +7,7 @@ true true + CommonModule.МокитоСлужебный CommonModule.ЮТТестовыеДанные CommonModule.ЮТУтверждения Subsystem.ЮТФункциональность diff --git a/ТестыПример/DT-INF/PROJECT.PMF b/ТестыПример/DT-INF/PROJECT.PMF index 3b39ff43..16b36590 100644 --- a/ТестыПример/DT-INF/PROJECT.PMF +++ b/ТестыПример/DT-INF/PROJECT.PMF @@ -1,3 +1,3 @@ Manifest-Version: 1.0 Runtime-Version: 8.3.10 -Base-Project: configuration +Base-Project: BSP diff --git a/ТестыПример/src/Configuration/Configuration.mdo b/ТестыПример/src/Configuration/Configuration.mdo index e7133a26..213ea7fb 100644 --- a/ТестыПример/src/Configuration/Configuration.mdo +++ b/ТестыПример/src/Configuration/Configuration.mdo @@ -6,9 +6,7 @@ Tests Adopted - - Checked - +