powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как юнит-тестить абстрактные классы ?
24 сообщений из 24, страница 1 из 1
Как юнит-тестить абстрактные классы ?
    #38267050
Половина методов имеет реализацию, а половина нет. При этом, часть приватных полей должна быть заполнена потомками, перед вызовом методов базового класса.

Как это вообще тестировать ?
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267108
Спиридончикчасть приватных полей

защищенных (protected) имелось ввиду.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267395
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за глупость, тестить абстрактные классы? Абстрактные классы не имеют логики.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267431
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СпиридончикКак это вообще тестировать ?Унаследуйтесь от базового класса и расставьте заглушки вместо абстрактных методов. Дальше - все как обычно.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267436
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleАбстрактные классы не имеют логики.Зуб дадите? :)
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267474
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvskoleАбстрактные классы не имеют логики.Зуб дадите? :)О, какой крутой на форум заглянул, лучше бы ты так круто абстракные классы проектировал, и прежде, чем писать там логику 10 раз повторил бы как мантру "абстрактный класс".
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267916
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skolesphinx_mvпропущено...
Зуб дадите? :)О, какой крутой на форум заглянул, лучше бы ты так круто абстракные классы проектировал, и прежде, чем писать там логику 10 раз повторил бы как мантру "абстрактный класс".КГ/АМ

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

Если не хватит, то рассказываю: единственный прямой запрет, который существует для абстрактных класов - создание экземпляров этого класса. И это - все!
И только религиозные соображения и недостаток практического опыта может запретить включать в этот абстрактный (базовый) класс реализацию других (не-абстрактных) методов и свойств, включая статические.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267961
Я 100% поддерживаю версию, что абстрактные классы могут содержать логику.
И даже более чем могу себе представить, что предок переопределит всего какие-нибудь 10% методов и класс будет полностью функционален-т.е. все будет делать абстрактный родитель. Почему бы и нет.

Тут вся суть в том, что сам абстрактный класс может в своей логике обращатся к виртуальным методам и свойствам. Т.е. по сути абстрактный класс полностью и реализует всю логику, а за мелочами обращается к переопределенным методам.

Вот думаю как быть с тестированием класса, который "фифти-фифти" и сам имеет методы с логикой, и абстрактные методы, к которым обращается, в расчете, что они перегружены потомками.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267972
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спиридончик,

sphinx_mv вроде как ответил
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38267999
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skole не отличает абстрактные классы от интерфейсов, по всей видимости.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268015
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спиридончиккласса, который "фифти-фифти" и сам имеет методы с логикой, и абстрактные методы, к которым обращается, в расчете, что они перегружены потомками .Это полный ахтунг. Если базовый класс зависит от наследника, то пусть зависит через интерфейс.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268041
Так у меня уточняющий вопрос.
У меня есть абстрактный класс. А еще есть 2 его потомка (для того абстрактные классы и существуют, чтобы дать возможность "разветвиться" коду).

Вы как предлагаете тестирова ? Создать еще одного потомка, но абстрактные методы должны возвращать некие константы - чтобы я мог расчитать логику в абстрактном классе, и сравнить ее в асерте ?

правильно понял я ?
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268063
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я говорил в целом, а не разрезе тестирования, хотя теперь сам с собой не согласен, что это ахтунг :). Это нормально, что класс вызывает собственные методы, пусть они и обязаны быть переопределены.

Ну а тестировать как сказал sphinx_mv, тут нечего добавить.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268134
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование абстрактного класса в качестве base class это такая же бессмыслица, как и его тестирование, как раз в этом случае нужно использовать обычный nested class или интерфейс, последний в целях использования не экземпляра класса, а его типа.

Абстрактный класс предполагает, прежде всего, определение набора методов для нижележащих классов и (override) методов, да, он может задавать поведение - return int, например, но практическая реализация метода находится всегда за кулисами. Именно для этого и применяются абстрактные классы – отделить другой логический блок от общего функционала, по другому это называется best practice.

Продолжайте дискуссию, товарищи
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268162
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleИспользование абстрактного класса в качестве base class это такая же бессмыслица, как и его тестирование
пошёл за попкорном
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268202
skoleИспользование абстрактного класса в качестве base class это такая же бессмыслица (1) , как и его тестирование (2) , как раз в этом случае нужно использовать обычный nested class или интерфейс, последний в целях использования не экземпляра класса, а его типа.

Абстрактный класс предполагает, прежде всего, определение набора методов для нижележащих классов и (override) методов (3) , да, он может задавать поведение - return int, например, но практическая реализация метода находится всегда за кулисами. Именно для этого и применяются абстрактные классы – отделить другой логический блок от общего функционала, по другому это называется best practice.

Продолжайте дискуссию, товарищи


(1) А чем еще должны быть абстрактные классы, как не base ? Если мне нужно определить только контракт, без логики, я использую интерфейс. Если же мне нужно заложить какую-то логику, то это абстрактный класс.
Хотя такая классификация не совсем полна. Сейчас не вспомню, но где-то прочитал умную мысль: Интерфейс означает "ведет себя как", а абстрактный класс означает "является".

Интерфейс можно вставить во многие совершенно никак не связанные между собой классы. Как например IEnumerable, IEquatable. Очень многие классы могут быть Перечисленны и Сравнены между собой. Но все эти классы вообще никак не связанны (разные классы, в смысле) между собой.

Принадлежность к базовому классу более тесная связь. Гляньте, к примеру, на класс System.data.common.dbconnection. Все его потомки физически тесно связаны между собой, тем, что основаны на фундаменте одного базового класса.

Этот класс явно требует от потомков переопределить часть методов:
Примечания для наследующих объектов
При наследовании из объекта DbConnection необходимо
переопределить следующие члены: Close, BeginDbTransaction, ChangeDatabase, CreateDbCommand, Open и StateChange. Необходимо предоставить следующие свойства: ConnectionString, Database, DataSource, ServerVersion и State.

Если не переопределелите, то словите NotImplementedException во время выполнения.

(2). Если есть код, который выполняет некую логику, то она должна быть протестирована.
Пусть не 100% покрытия кода, но существенная часть критичных вычислений - точно. Это аксиома юнит тестов. Почему абстрактный класс должен отходить от этой аксиомы ?

(3) Это описание больше подходит интерфейсу. Это интерфейс всего лишь описывает контракт методов, без реализации.
Гляньте на иерархию наследования dbconnection. Все его предки, как и он сам, наверняка напичканы логикой. Что же, их не нужны юнит тесты ?
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268264
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skole Использование абстрактного класса в качестве base class это такая же бессмыслица, как и его тестирование, как раз в этом случае нужно использовать обычный nested class или интерфейс, последний в целях использования не экземпляра класса, а его типа.О, как! А мужики-то и не знают! abstract (Справочник по C#)
Модификатор abstract указывает, что реализация изменяемого объекта является неполной или отсутствует. Модификатор abstract может использоваться с классами, методами, свойствами, индексаторами и событиями. Модификатор abstract в объявлении класса указывает, что класс предназначен только для использования в качестве базового класса для других классов. Члены, помеченные как абстрактные или включенные в абстрактный класс, должны быть реализованы с помощью классов, производных от абстрактных классов. Ну, а бездумное (и безумное) использование вложенных классов и интерфейсов - редкостная жесть.
skoleАбстрактный класс предполагает, прежде всего, определение набора методов для нижележащих классов и (override) методов, да, он может задавать поведение - return int, например, но практическая реализация метода находится всегда за кулисами. Именно для этого и применяются абстрактные классы – отделить другой логический блок от общего функционала, по другому это называется best practice."Смешались в кучу кони... люди..." (с)
Оно и понятно - собственных мозгов на поиск ссылок в документации Вам не хватило... Ну, да ладно... Вот Вам пара примеров абстрактных классов и вариантов их использования от "первоисточника": WebResponse и WebRequest - наслаждайтесь и просвещайтесь.

Как только разработчик начинает оперировать термином "best practice", совершенно не имея малейшего представления о "practice", его можно смело увольнять нафиг с "волчьим билетом"... Собственно, "разработчика" с озвученым уровнем теоретических познаний и принимать на работу не особо есть смысл...
skoleПродолжайте дискуссию, товарищиАфтар жжот! Пеши есчо...
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268292
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того чтобы определить функционал в base class совсем не обязательно объявлять его абстрактным.

Абстрактный класс почти всегда является «фасадом», топ-классом, если понятней, все остальные классы, которые его наследуют, инкапсулируют логику и функционал методов в своей реализации, как в случае с той либой, для каждого соединения мы используем свою процедуру, но для их использования нам нужно вызвать публичные методы абстрактного класса.

Интерфейсов подробно касаться не буду, это отдельная тема, интерфейс, прежде всего, инкапсулирует в себе тип класса, что позволяет избежать межклассовой зависимости в логике.

А тесты пишутся на конкретный элемент логики, а не на абстрактный.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268306
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спиридончик, не берите в голову - невозможно переубедить "непереубеждаемых".

Даже если это кому-то может не понравиться, делайте так, как, в первую очередь, Вам самому понятнее, удобнее и проще. Хотя бы из-за того, что не всегда (точнее, очень редко) "самые лучшие паттерны программирования" на самом деле лучше всего подходят для реализации конкретной, практической задачи - просто из-за того, что они вне области применения . И для понимания этого нужно самостоятельно набить достаточное колличество своих собственных шишек.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268434
skoleДля того чтобы определить функционал в base class совсем не обязательно объявлять его абстрактным (1).

Абстрактный класс почти всегда является «фасадом», топ-классом, если понятней, все остальные классы, которые его наследуют, инкапсулируют логику и функционал методов в своей реализации(2), как в случае с той либой, для каждого соединения мы используем свою процедуру, но для их использования нам нужно вызвать публичные(3) методы абстрактного класса.

Интерфейсов подробно касаться не буду, это отдельная тема, интерфейс, прежде всего, инкапсулирует в себе тип класса(4), что позволяет избежать межклассовой зависимости в логике.

А тесты пишутся на конкретный элемент логики, а не на абстрактный (5).

(1) А кто говорит иное ?
Никто не решает, что "я вот хочу создать абстрактный класс". Направление мыслей скорее обратное "Данный метод в данном классе не имеет смысла. Методы должны определить наследники. Выходит мы получили абстрактный класс. Ок"

Слово абстрактный, просто напоминание для програмимста, что "ты не сможешь создать объект".
Я уже не помню, но кажется в C++ вообще нет понятие "абстрактный" в ключевых словах (по крайней мере то, каким я его помню годах в 90ых). Там абстрактным считался класс, у которого были "чистые виртуальные функции. =0".
А интерфейсом считался класс, у которого все функции были чистыми-виртуальными, между прочим.

Эти термины были всего лишь договоренностью между программистами.
Введение слов Abstract и Interface просто задокументировало факт различий между этими разными сущеностями.
Прогресс не стоит на месте, языки программирования развиваются. Что-то появляется сначало ввиде формальных договоренностей между программистами. И если это приживается, то переходит в спецификацию языка.

Абстрактный класс - это просто класс. И как просто класс, он может содержать какую угодно логику. И то, что он "ой. получился абстрактным" не делает его ни лучше, ни хуже других.

Есть еще такое понятие, как "исключение дублирования кода". Базовые классы занимаются этим самым исключением, реализуя в себе максимум логики.

(2) Собственно вы описали совершенно типичный базовый класс. Простой базовый класс, создающий некоторые очертания и границы функционала, за который не могут выйти его наследники.

Точнее может и могут. От DbConnection вы без проблем можете породить наследника занимающийся форматированием текста. Но такой подход в архитектуре просто вас же и запутает.

И я пожелаю удачи тому, программисту которому достанется сопровождать проект, в котором наследник DbConnection занимается форматированием текста, а парсер XML соединением с базой данным и поддержкой транзакционности :)


(3) Виртуальные методы обычно делают protected. Иначе из-за ошибочного приведения типов, сможете случайно вызвать метод абстрактного класса и словить NotImplementedException.
Надежней объявить его защищенным, а уж наследник сам решит открывать ли его или нет.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268460
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleДля того чтобы определить функционал в base class совсем не обязательно объявлять его абстрактным.Ты вообще в курсе, зачем класс делать абстрактным? Чтобы исключить возможность создания его экземпляра напрямую, а не через наследника. И всё. К наличию/отсутствию логики это не имеет никакого отношения.

skoleИнтерфейсов подробно касаться не будуУж будь добр, а то я из-под стола до вечера не вылезу, а Изопропил попкорном подавится.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268462
(4) Чито ? как интерфейс может инкапсулировать в себе тип ?
Какой тип инкапсулирует в себе интерфейс IEnumerable ?

Интерфейс инкапсулирует в себе поведение. Класс, реализующий интерфейс говорит, что он обязуется вести себя так как указанно.

Это, в частности, поможет "избежать межклассовой зависимости в логике" (inversion of control), но и не только. Это не единственная функция интерфейсов.

(5) Класс называется абстрактным, всего лишь потому, что у него есть абстрактные методы.
Но у него есть и обычные методы. Вот их и надо тестировать.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268474
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спиридончик(4) Чито ? как интерфейс может инкапсулировать в себе тип ?
Какой тип инкапсулирует в себе интерфейс IEnumerable ?школие имел ввиду интерфейс == тип. Объектный тип. Объектный тип может описывать поведение, никаких противоречий.

Спиридончик(5) Класс называется абстрактным, всего лишь потому, что у него есть абстрактные методы.
Но у него есть и обычные методы. Вот их и надо тестировать.Класс называется абстрактным потому что не порождает объектов. Абстрактных методов у него может и не быть.
...
Рейтинг: 0 / 0
Как юнит-тестить абстрактные классы ?
    #38268902
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошая дискуссия получилась, вот только про тесты, товарищи, еще никто не высказался, а?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как юнит-тестить абстрактные классы ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]