С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545

Тестирование закрытых классов, подписка на события

13.02.2015, 18:26. Показов 1572. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что нужно делать чтобы подписаться на событие закрытого класса внутри тестового проекта?
Внутри аксессора нет события как такового, только доступ к методам add_SomeEvent и remove_SomeEvent, при этом при вызове метода
C#
1
add_SomeEvent(System.EventHandler<SomeClass_Accessor.SomeEventArgs>)
студия жалуется на то что тип SomeClass_Accessor.SomeEventArgs не приводится к System.EventArgs. И это так.
Вопрос:
Как внутри теста подписываться на события теневого класса
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2015, 18:26
Ответы с готовыми решениями:

Тестирование закрытых методов через разделяемые классы
Я - большой любитель тестирования непубличных методов. Связано это с тем, что обычно публичных методов у меня немного и работают они через...

Подписка на события
Доброго времени суток! Не совсем понимаю как это работает? Где обработчик писать?

Не работает подписка на события
Имеется массив контролов TextBox Dim txtDigit As TextBox() = New TextBox(0 To 80) {} и динамически добавляемое событие: ...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14169 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
13.02.2015, 19:29
KeBJIaP, похоже add_SomeEvent ожидает делегат другого типа. Посмотри его сигнатуру и передай экземпляр делегата нужного типа.
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
16.02.2015, 11:52  [ТС]
OwenGlendower, Нет, там похоже класс- обертка для EventArgs не наследуется от этого самого EventArgs, таким образом не отдать метод обработки (object, SomeEventArgs_Accessor) в делегат (object, EventArgs).
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2015, 12:15
KeBJIaP, если нужно тестировать закрытый класс, значит косяк в модульности
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
16.02.2015, 12:39  [ТС]
Psilon, Внутри класса, занимающегося передачей-получением сообщений и их классификацией по внутренним алгоритмам имеется класс, занимающийся сериализацией и оформлением пакета данных для отправки по сети. Неужени, мне нужно высунуть интерфейс этого класса наружу, если он снаружи некому не интересен, а нужен только ряду приватных классов типов сообщений?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2015, 12:49
KeBJIaP, ну все алгоритмы, которые нужно тестировать, очевидно должны быть публичными. А приватным достаточно сделать простой класс, который эти алгоритмы выполняет.

Простой пример: я писал windows service, который периодически опрашивал БД и по результатам отправлял письма и смс. Мне нужно было протестировать всё это дело, но естественно я не могу этого сделать, не сделав методы публичными. В результаты, чтобы не плодить костыли, я просто вынес в отдельную длл весь функционал, а сервис занимался только вызовом библиотечных методов, ну а длл с публичными методами прекрасно поддается тестированию.

В итоге методы будут видеть только те, кто специально сослался на библиотеку, а этим людям, наверное, эти методы всё-таки нужны. А методы сервиса естественно были приватными. В результате и волки сыты, и овцы целы, и пастуху вечная память.
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
16.02.2015, 13:06  [ТС]
Psilon, С этим я конечно согласен, однако наличие в ВС автоматизированного тестирования наводит на мысль покрытия тестами ключевой функциональности. Для твоего примера, мне бы хотелось повесить тесты для функционала классификации данных из базы. Безусловно, для такого важного компонента стоит пожертвовать инкапсуляцией ради тестируемости. Но у меня например имеются 12 классов различных типов сообщений, я должен быть уверен что каждый тип упаковывается и распаковывается правильно вне зависимости от того что я меняю в коде. Нельзя же вешать 12 классов на публику, но и по условиям задачи библиотеку сделать не получится. Хотя если не выйдет нормальный тест написать, то придется так и делать. И, конечно не public а internal и поставить для теста internal visible.
Вообще, для решения конкретно моей проблемы требуется в метадате добавить что теневая оболочка класса SomeEventArgs наследуется от EventArgs. Как это можно провернуть не подскажешь?
А черт, оболочка уже унаследована от BaseShadow. Косяк.

Добавлено через 2 минуты
Ладно, тогда другой вопрос: Можно ли тестовые методы встраивать в не-тестовый класс

Добавлено через 12 секунд
Ладно, тогда другой вопрос: Можно ли тестовые методы встраивать в не-тестовый класс
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2015, 13:12
KeBJIaP, Тестируются только публичные методы. Точка. Всё остальное - детали реализации. Следовательно если метод нужно тестировать - он должен быть публичный. Если класс нужно тестировать - он должен быть публичным. Тестирование "Деталей реализации" (а именно это и означает ключевое слово private/protected) - это костыли, которых по идее быть не должно и котороые методологией не поддерживаются. Ну я надеюсь, понятно, что должно быть больше 1 dll, одна - реализует библиотечку (то, что вы хотите протестировать и должно быть публичным), вторая - всё остальное. Проект с тестами - третий, тестирует только первую (с открытыми методами). Это как должно быть в теории. А как сделаете - так сделаете. Можно хоть через рефлексию доставать приватные методы, вопрос только - смысл? Если не захламлять область видимости, то достаточно вынести всё в отдельную дллку, если вопрос в "защищенности", то точно также, как тесты доставать будут приватные методы, сможет достать кто угодно. Вывод - бессмысленно городить костыли там, где они не нужны.

Добавлено через 52 секунды
Цитата Сообщение от KeBJIaP Посмотреть сообщение
Ладно, тогда другой вопрос: Можно ли тестовые методы встраивать в не-тестовый класс
по идее можно. Но вопрос из серии "можно ли изменять неизменяемые шарповые строки", ответ - можно, но себе дороже. Хотя если выбрали пусть костылей и велосипедов, то это правильное решение!
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
16.02.2015, 13:37  [ТС]
Psilon, Мне не хочется идти путем костылей и велосипедов, поэтому я и интересуюсь возможностями.
Из твоих слов следует, что придется выбирать между покрытием тестами и инкапсуляцией, правильно я понимаю?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2015, 13:55
Лучший ответ Сообщение было отмечено KeBJIaP как решение

Решение

KeBJIaP, не совсем. Смотри, зачем тебе нужны тесты, что они проверяют? Они проверяют входные и выходные данные, внутри - черный ящик, тебе плевать, что там происходит, лишь бы он делал то, что ты от него хочешь.

Если тебе нужно протестировать какой-то функционал, следовательно из п.1. этот функционал не должен скрываться. Это называется АПИ библиотеки.

Если тебе не надо показывать это пользователю твоей либы, то ты просто сделай еще одну библиотеку (а-ля LibraryUtils) и ссылайся на неё из свой либы. В итоге получаешь

1. Library - твоя библиотека, которая предоставляет АПИ для юзера.
2. LibraryUtils - твоя библиотека, которая предоставляет твоё внутреннее АПИ для твоей же библиотеки. Сюда отправляется под модификатор public всё, что ты хочешь протестировать, и под модификатор private всё, что не нужно в основной библиотеке.
3. LibraryTests - понятно
4. LibraryUtilsTests - понятно
5. UserCode - он ссылается на Library, он не видит публичные классы и методы из LibraryUtils. В результате твоя инкапсуляция не нарушается.

Конечно, он может сослаться и на LibraryUtils и вызывать твои публичные методы, предназначенные для внутреннего использования, но он точно также при большом желании сможет вызывать их напрямую через рефлексию. Модификаторы доступа являются рекомендательными (мы НЕ ХОТИМ показывать это поле), а не запретительными (мы НЕ ДАДИМ вам посмотреть это поле). Поэтому пытаться с их помощью кому-то что-то запретить нельзя. Можно просто попросить юзеров следовать Fair Use: не ссылайтесь на служебную библиотеку, и всё.
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
16.02.2015, 14:16  [ТС]
Psilon, Спасибо, буду переделывать модули.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2015, 14:19
KeBJIaP, да нз, обращайся
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2015, 14:19
Помогаю со студенческими работами здесь

Подписка на события объектов
доброе утро. суть вопроса немного отражает заголовок... в общем есть некий класс, который производит поиск файлов (но он не главный...

Подписка на события Event
Существует основная форма, создается при запуске программы public partial class MainWindow : Form { public static...

Форма и подписка на события
Не могу понять почему следующий код генерит исключение using System; namespace Book { class BookInfo { ...

Подписка на события путём использования аксессоров
Здравствуйте! Никак не могу понять каким образом здесь происходит подписка на события с помощью аксессоров. Проходился несколько раз...

Динамическое создание компонентов и подписка их на события
Здравствуйте! Меня интересует вопрос: как можно создать что-нибудь по заготовке? Звучит туманно, но попробую объяснить подробнее....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru