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

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

13.02.2015, 18:26. Показов 1578. Ответов 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
18250 / 14174 / 5366
Регистрация: 17.03.2014
Сообщений: 28,851
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru