add icon indicating copy to clipboard operation
add copied to clipboard

xUnit Не работает подключение плагинов внутри плагинов

Open Ndochp opened this issue 5 years ago • 2 comments

Описание ошибки

Не работает подключение плагинов внутри плагинов. Не работает плагин ВыводВЛогФайл

Сценарий воспроизведения

  1. создать c:__\out.txt (чтобы второй тест зеленел)
  2. Запустить обработку с тестами (см ниже)
Перем КонтекстЯдра;
Перем Лог;
Перем Файлы;


Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
	КонтекстЯдра = КонтекстЯдраПараметр;
	Лог = КонтекстЯдра.Плагин("ВыводВЛогФайл");
	Файлы = КонтекстЯдра.Плагин("Файлы");
КонецПроцедуры

Процедура ЗаполнитьНаборТестов(НаборТестов) Экспорт
	НаборТестов.Добавить("Тест_ПроверитьЛогПлагин");
	НаборТестов.Добавить("Тест_ПроверитьФайлыПлагин");
КонецПроцедуры

Процедура ПередЗапускомТеста() Экспорт
	
	НачатьТранзакцию();     
	
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт
	
	Если ТранзакцияАктивна() Тогда
		ОтменитьТранзакцию();
	КонецЕсли;
	
КонецПроцедуры

Процедура Тест_ПроверитьЛогПлагин()  Экспорт
	Лог.ОткрытьФайл("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]

Ndochp avatar Feb 05 '20 13:02 Ndochp

Дублирую свой ответ из телеграма Artur Ayukhanov: Насколько я понял, это серверный тест из модуля объекта, который вызывается в тонком клиенте. Нужно помнить, что на сервере нет состояний, поэтому все глобальные переменные пусты при осередном переходе на сервер (

В итоге тест прекрасно работает в обычном приложении, но не будет работать в тонком клиенте

Ждя решения - отказаться от глоб.переменных в серверном тесте и использовать получение плагина в момент вызова Или переписать на клиентский тест в модуле упр.формы. но тогда не будет транзакций

На сервере контекст ядра можно получить через КонтекстЯдра = ВнешниеОбработки.Подключить("xddTestRunner"); Естественно, при этом у контекста ядра также нет состояния, но можно пользоваться кучей его методов. В FAQ Vanessa-Add об этом написано. Там же документирован аналогичный способ подключения плагинов на сервере ) Вот такая магия )

artbear avatar Feb 07 '20 17:02 artbear

Насколько я понимаю, проблема в том, что плагины инициализируются при запуске обработки тестирования. и в момент инициализации теста они уже "протухшие". А при вызове метода теста инициализированные переменные (и контекст ядра и все плагины) остаются живыми. Сейчас добавил переинициализацию плагина в метод КонтекстЯдра.Плагин("Имя") и заработало. Но не могу корректно описать условие, когда это нужно делать. То есть достаточно обернуть в #Если Сервер или нужна более сложная логика.

Функция Плагин(Знач Идентификатор) Экспорт

	ИдентификаторПлагинаСПрефиксомПодсистемы = ДополнитьИдентификаторПрефиксомПодсистемы(Идентификатор);
	ИдентификаторПлагинаБезПрефиксаПодсистемы = ПолучитьИдентификаторБезПрефиксаПодсистемы(Идентификатор);
	Плагин = Плагины[ИдентификаторПлагинаБезПрефиксаПодсистемы];
	Если ТипЗнч(Плагин) = Тип("Строка") Тогда
		Плагин = СоздатьОбъектПлагина(Плагин);
	КонецЕсли;

#Если Сервер Тогда //+++ тут должна быть проверка на то, что изначальный запуск на тонком клиенте
	КонтекстЯдра = ЭтотОбъект;
	Плагин.Инициализация(КонтекстЯдра);
#КонецЕсли

	Возврат Плагин;

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

Ndochp avatar Feb 08 '20 08:02 Ndochp