|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
||||||
Тестирование закрытых классов, подписка на события13.02.2015, 18:26. Показов 1578. Ответов 11
Метки нет (Все метки)
Что нужно делать чтобы подписаться на событие закрытого класса внутри тестового проекта?
Внутри аксессора нет события как такового, только доступ к методам add_SomeEvent и remove_SomeEvent, при этом при вызове метода
Вопрос: Как внутри теста подписываться на события теневого класса
0
|
||||||
| 13.02.2015, 18:26 | |
|
Ответы с готовыми решениями:
11
Тестирование закрытых методов через разделяемые классы
Не работает подписка на события |
|
Администратор
|
|
| 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
|
|
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
|
| 16.02.2015, 12:39 [ТС] | |
|
Psilon, Внутри класса, занимающегося передачей-получением сообщений и их классификацией по внутренним алгоритмам имеется класс, занимающийся сериализацией и оформлением пакета данных для отправки по сети. Неужени, мне нужно высунуть интерфейс этого класса наружу, если он снаружи некому не интересен, а нужен только ряду приватных классов типов сообщений?
0
|
|
|
Master of Orion
|
|
| 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
|
||
| 16.02.2015, 13:12 | ||
|
KeBJIaP, Тестируются только публичные методы. Точка. Всё остальное - детали реализации. Следовательно если метод нужно тестировать - он должен быть публичный. Если класс нужно тестировать - он должен быть публичным. Тестирование "Деталей реализации" (а именно это и означает ключевое слово private/protected) - это костыли, которых по идее быть не должно и котороые методологией не поддерживаются. Ну я надеюсь, понятно, что должно быть больше 1 dll, одна - реализует библиотечку (то, что вы хотите протестировать и должно быть публичным), вторая - всё остальное. Проект с тестами - третий, тестирует только первую (с открытыми методами). Это как должно быть в теории. А как сделаете - так сделаете. Можно хоть через рефлексию доставать приватные методы, вопрос только - смысл? Если не захламлять область видимости, то достаточно вынести всё в отдельную дллку, если вопрос в "защищенности", то точно также, как тесты доставать будут приватные методы, сможет достать кто угодно. Вывод - бессмысленно городить костыли там, где они не нужны.
Добавлено через 52 секунды
1
|
||
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
|
| 16.02.2015, 13:37 [ТС] | |
|
Psilon, Мне не хочется идти путем костылей и велосипедов, поэтому я и интересуюсь возможностями.
Из твоих слов следует, что придется выбирать между покрытием тестами и инкапсуляцией, правильно я понимаю?
0
|
|
|
Master of Orion
|
|
| 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
|
|
| 16.02.2015, 14:19 | |
|
KeBJIaP, да нз, обращайся
0
|
|
| 16.02.2015, 14:19 | |
|
Помогаю со студенческими работами здесь
12
Подписка на события объектов Подписка на события Event
Подписка на события путём использования аксессоров
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 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?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|