add
add copied to clipboard
xUnit Не работает подключение плагинов внутри плагинов
Описание ошибки
Не работает подключение плагинов внутри плагинов. Не работает плагин ВыводВЛогФайл
Сценарий воспроизведения
- создать c:__\out.txt (чтобы второй тест зеленел)
- Запустить обработку с тестами (см ниже)
Перем КонтекстЯдра;
Перем Лог;
Перем Файлы;
Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
Лог = КонтекстЯдра.Плагин("ВыводВЛогФайл");
Файлы = КонтекстЯдра.Плагин("Файлы");
КонецПроцедуры
Процедура ЗаполнитьНаборТестов(НаборТестов) Экспорт
НаборТестов.Добавить("Тест_ПроверитьЛогПлагин");
НаборТестов.Добавить("Тест_ПроверитьФайлыПлагин");
КонецПроцедуры
Процедура ПередЗапускомТеста() Экспорт
НачатьТранзакцию();
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПроцедуры
Процедура Тест_ПроверитьЛогПлагин() Экспорт
Лог.ОткрытьФайл("c:\__\out.txt");
Лог.Вывести("Текст");
КонецПроцедуры
Процедура Тест_ПроверитьФайлыПлагин() Экспорт
Файлы.Существует("c:\__\out.txt");
КонецПроцедуры
Первый тест приводит к
Значение не является значением объектного типа (Плагин) {ВнешняяОбработка.ВыводВЛогФайл.МодульОбъекта(68)}: Файлы = КонтекстЯдра.Плагин("Файлы");{ВнешняяОбработка.ВыводВЛогФайл.МодульОбъекта(34)}: СоздатьПлагины();{ВнешняяОбработка.Тест_ПроверкиЛога.МодульОбъекта(32)}: Лог.ОткрытьФайл("c:\__\out.txt");{(1)}:КонтекстВыполнения.Тест_ПроверитьЛогПлагин();{ВнешняяОбработка.xddTestRunner.МодульОбъекта(337)}: Выполнить(ИcполняемыйКод);{ВнешняяОбработка.xddTestRunner.МодульОбъекта(261)}: ВыполнитьПроцедуруКонтекста(КонтекстВыполнения, ЭлементДереваТестов.ИмяМетода, ЭлементДереваТестов.Параметры);{ВнешняяОбработка.xddTestRunner.Форма.УправляемаяФорма.Форма(904)}: РезультатТестирования = ОбъектНаСервере.ВыполнитьТестовыйМетод(КонтекстВыполнения, ЭлементДереваТестов);
Ожидаемое поведение, если бы ошибки не было Можно использовать КонтекстЯдра.Плагин(" в плагинах
Скриншоты если применимо, приложите скриншоты
Окружение:
- Версия операционной системы: [
Windows 10 (64)] - Редакция платформы 1С [
8.3.15.1656] - Версия
Vanessa.ADD[например,6.5.0]
Дублирую свой ответ из телеграма Artur Ayukhanov: Насколько я понял, это серверный тест из модуля объекта, который вызывается в тонком клиенте. Нужно помнить, что на сервере нет состояний, поэтому все глобальные переменные пусты при осередном переходе на сервер (
В итоге тест прекрасно работает в обычном приложении, но не будет работать в тонком клиенте
Ждя решения - отказаться от глоб.переменных в серверном тесте и использовать получение плагина в момент вызова Или переписать на клиентский тест в модуле упр.формы. но тогда не будет транзакций
На сервере контекст ядра можно получить через КонтекстЯдра = ВнешниеОбработки.Подключить("xddTestRunner"); Естественно, при этом у контекста ядра также нет состояния, но можно пользоваться кучей его методов. В FAQ Vanessa-Add об этом написано. Там же документирован аналогичный способ подключения плагинов на сервере ) Вот такая магия )
Насколько я понимаю, проблема в том, что плагины инициализируются при запуске обработки тестирования. и в момент инициализации теста они уже "протухшие". А при вызове метода теста инициализированные переменные (и контекст ядра и все плагины) остаются живыми. Сейчас добавил переинициализацию плагина в метод КонтекстЯдра.Плагин("Имя") и заработало. Но не могу корректно описать условие, когда это нужно делать. То есть достаточно обернуть в #Если Сервер или нужна более сложная логика.
Функция Плагин(Знач Идентификатор) Экспорт
ИдентификаторПлагинаСПрефиксомПодсистемы = ДополнитьИдентификаторПрефиксомПодсистемы(Идентификатор);
ИдентификаторПлагинаБезПрефиксаПодсистемы = ПолучитьИдентификаторБезПрефиксаПодсистемы(Идентификатор);
Плагин = Плагины[ИдентификаторПлагинаБезПрефиксаПодсистемы];
Если ТипЗнч(Плагин) = Тип("Строка") Тогда
Плагин = СоздатьОбъектПлагина(Плагин);
КонецЕсли;
#Если Сервер Тогда //+++ тут должна быть проверка на то, что изначальный запуск на тонком клиенте
КонтекстЯдра = ЭтотОбъект;
Плагин.Инициализация(КонтекстЯдра);
#КонецЕсли
Возврат Плагин;
КонецФункции