|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Половина методов имеет реализацию, а половина нет. При этом, часть приватных полей должна быть заполнена потомками, перед вызовом методов базового класса. Как это вообще тестировать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 18:35 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Спиридончикчасть приватных полей защищенных (protected) имелось ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 19:01 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Что за глупость, тестить абстрактные классы? Абстрактные классы не имеют логики. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 23:55 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
СпиридончикКак это вообще тестировать ?Унаследуйтесь от базового класса и расставьте заглушки вместо абстрактных методов. Дальше - все как обычно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 00:40 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skoleАбстрактные классы не имеют логики.Зуб дадите? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 00:45 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
sphinx_mvskoleАбстрактные классы не имеют логики.Зуб дадите? :)О, какой крутой на форум заглянул, лучше бы ты так круто абстракные классы проектировал, и прежде, чем писать там логику 10 раз повторил бы как мантру "абстрактный класс". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 01:35 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skolesphinx_mvпропущено... Зуб дадите? :)О, какой крутой на форум заглянул, лучше бы ты так круто абстракные классы проектировал, и прежде, чем писать там логику 10 раз повторил бы как мантру "абстрактный класс".КГ/АМ Вам бы, прежде чем "вычислять 100500-й знак числа пи" на форуме, настоятельно рекомендуется ознакомиться с концепцией абстрактных классов и с теми ограничениями и требованиями, которые для них существуют не в Вашем воспаленном воображении, а непосредственно по документации. Ссылку дать? Или мозгов самостоятельно ее найти все же хватит? Если не хватит, то рассказываю: единственный прямой запрет, который существует для абстрактных класов - создание экземпляров этого класса. И это - все! И только религиозные соображения и недостаток практического опыта может запретить включать в этот абстрактный (базовый) класс реализацию других (не-абстрактных) методов и свойств, включая статические. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:16 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Я 100% поддерживаю версию, что абстрактные классы могут содержать логику. И даже более чем могу себе представить, что предок переопределит всего какие-нибудь 10% методов и класс будет полностью функционален-т.е. все будет делать абстрактный родитель. Почему бы и нет. Тут вся суть в том, что сам абстрактный класс может в своей логике обращатся к виртуальным методам и свойствам. Т.е. по сути абстрактный класс полностью и реализует всю логику, а за мелочами обращается к переопределенным методам. Вот думаю как быть с тестированием класса, который "фифти-фифти" и сам имеет методы с логикой, и абстрактные методы, к которым обращается, в расчете, что они перегружены потомками. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:36 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Спиридончик, sphinx_mv вроде как ответил ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:40 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skole не отличает абстрактные классы от интерфейсов, по всей видимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:49 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Спиридончиккласса, который "фифти-фифти" и сам имеет методы с логикой, и абстрактные методы, к которым обращается, в расчете, что они перегружены потомками .Это полный ахтунг. Если базовый класс зависит от наследника, то пусть зависит через интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 11:52 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Так у меня уточняющий вопрос. У меня есть абстрактный класс. А еще есть 2 его потомка (для того абстрактные классы и существуют, чтобы дать возможность "разветвиться" коду). Вы как предлагаете тестирова ? Создать еще одного потомка, но абстрактные методы должны возвращать некие константы - чтобы я мог расчитать логику в абстрактном классе, и сравнить ее в асерте ? правильно понял я ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 12:02 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Я говорил в целом, а не разрезе тестирования, хотя теперь сам с собой не согласен, что это ахтунг :). Это нормально, что класс вызывает собственные методы, пусть они и обязаны быть переопределены. Ну а тестировать как сказал sphinx_mv, тут нечего добавить. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 12:09 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Использование абстрактного класса в качестве base class это такая же бессмыслица, как и его тестирование, как раз в этом случае нужно использовать обычный nested class или интерфейс, последний в целях использования не экземпляра класса, а его типа. Абстрактный класс предполагает, прежде всего, определение набора методов для нижележащих классов и (override) методов, да, он может задавать поведение - return int, например, но практическая реализация метода находится всегда за кулисами. Именно для этого и применяются абстрактные классы – отделить другой логический блок от общего функционала, по другому это называется best practice. Продолжайте дискуссию, товарищи ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 12:42 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skoleИспользование абстрактного класса в качестве base class это такая же бессмыслица, как и его тестирование пошёл за попкорном ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 13:03 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
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. Все его предки, как и он сам, наверняка напичканы логикой. Что же, их не нужны юнит тесты ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 13:28 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skole Использование абстрактного класса в качестве base class это такая же бессмыслица, как и его тестирование, как раз в этом случае нужно использовать обычный nested class или интерфейс, последний в целях использования не экземпляра класса, а его типа.О, как! А мужики-то и не знают! abstract (Справочник по C#) Модификатор abstract указывает, что реализация изменяемого объекта является неполной или отсутствует. Модификатор abstract может использоваться с классами, методами, свойствами, индексаторами и событиями. Модификатор abstract в объявлении класса указывает, что класс предназначен только для использования в качестве базового класса для других классов. Члены, помеченные как абстрактные или включенные в абстрактный класс, должны быть реализованы с помощью классов, производных от абстрактных классов. Ну, а бездумное (и безумное) использование вложенных классов и интерфейсов - редкостная жесть. skoleАбстрактный класс предполагает, прежде всего, определение набора методов для нижележащих классов и (override) методов, да, он может задавать поведение - return int, например, но практическая реализация метода находится всегда за кулисами. Именно для этого и применяются абстрактные классы – отделить другой логический блок от общего функционала, по другому это называется best practice."Смешались в кучу кони... люди..." (с) Оно и понятно - собственных мозгов на поиск ссылок в документации Вам не хватило... Ну, да ладно... Вот Вам пара примеров абстрактных классов и вариантов их использования от "первоисточника": WebResponse и WebRequest - наслаждайтесь и просвещайтесь. Как только разработчик начинает оперировать термином "best practice", совершенно не имея малейшего представления о "practice", его можно смело увольнять нафиг с "волчьим билетом"... Собственно, "разработчика" с озвученым уровнем теоретических познаний и принимать на работу не особо есть смысл... skoleПродолжайте дискуссию, товарищиАфтар жжот! Пеши есчо... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 14:00 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Для того чтобы определить функционал в base class совсем не обязательно объявлять его абстрактным. Абстрактный класс почти всегда является «фасадом», топ-классом, если понятней, все остальные классы, которые его наследуют, инкапсулируют логику и функционал методов в своей реализации, как в случае с той либой, для каждого соединения мы используем свою процедуру, но для их использования нам нужно вызвать публичные методы абстрактного класса. Интерфейсов подробно касаться не буду, это отдельная тема, интерфейс, прежде всего, инкапсулирует в себе тип класса, что позволяет избежать межклассовой зависимости в логике. А тесты пишутся на конкретный элемент логики, а не на абстрактный. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 14:15 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Спиридончик, не берите в голову - невозможно переубедить "непереубеждаемых". Даже если это кому-то может не понравиться, делайте так, как, в первую очередь, Вам самому понятнее, удобнее и проще. Хотя бы из-за того, что не всегда (точнее, очень редко) "самые лучшие паттерны программирования" на самом деле лучше всего подходят для реализации конкретной, практической задачи - просто из-за того, что они вне области применения . И для понимания этого нужно самостоятельно набить достаточное колличество своих собственных шишек. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 14:21 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skoleДля того чтобы определить функционал в base class совсем не обязательно объявлять его абстрактным (1). Абстрактный класс почти всегда является «фасадом», топ-классом, если понятней, все остальные классы, которые его наследуют, инкапсулируют логику и функционал методов в своей реализации(2), как в случае с той либой, для каждого соединения мы используем свою процедуру, но для их использования нам нужно вызвать публичные(3) методы абстрактного класса. Интерфейсов подробно касаться не буду, это отдельная тема, интерфейс, прежде всего, инкапсулирует в себе тип класса(4), что позволяет избежать межклассовой зависимости в логике. А тесты пишутся на конкретный элемент логики, а не на абстрактный (5). (1) А кто говорит иное ? Никто не решает, что "я вот хочу создать абстрактный класс". Направление мыслей скорее обратное "Данный метод в данном классе не имеет смысла. Методы должны определить наследники. Выходит мы получили абстрактный класс. Ок" Слово абстрактный, просто напоминание для програмимста, что "ты не сможешь создать объект". Я уже не помню, но кажется в C++ вообще нет понятие "абстрактный" в ключевых словах (по крайней мере то, каким я его помню годах в 90ых). Там абстрактным считался класс, у которого были "чистые виртуальные функции. =0". А интерфейсом считался класс, у которого все функции были чистыми-виртуальными, между прочим. Эти термины были всего лишь договоренностью между программистами. Введение слов Abstract и Interface просто задокументировало факт различий между этими разными сущеностями. Прогресс не стоит на месте, языки программирования развиваются. Что-то появляется сначало ввиде формальных договоренностей между программистами. И если это приживается, то переходит в спецификацию языка. Абстрактный класс - это просто класс. И как просто класс, он может содержать какую угодно логику. И то, что он "ой. получился абстрактным" не делает его ни лучше, ни хуже других. Есть еще такое понятие, как "исключение дублирования кода". Базовые классы занимаются этим самым исключением, реализуя в себе максимум логики. (2) Собственно вы описали совершенно типичный базовый класс. Простой базовый класс, создающий некоторые очертания и границы функционала, за который не могут выйти его наследники. Точнее может и могут. От DbConnection вы без проблем можете породить наследника занимающийся форматированием текста. Но такой подход в архитектуре просто вас же и запутает. И я пожелаю удачи тому, программисту которому достанется сопровождать проект, в котором наследник DbConnection занимается форматированием текста, а парсер XML соединением с базой данным и поддержкой транзакционности :) (3) Виртуальные методы обычно делают protected. Иначе из-за ошибочного приведения типов, сможете случайно вызвать метод абстрактного класса и словить NotImplementedException. Надежней объявить его защищенным, а уж наследник сам решит открывать ли его или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 15:07 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
skoleДля того чтобы определить функционал в base class совсем не обязательно объявлять его абстрактным.Ты вообще в курсе, зачем класс делать абстрактным? Чтобы исключить возможность создания его экземпляра напрямую, а не через наследника. И всё. К наличию/отсутствию логики это не имеет никакого отношения. skoleИнтерфейсов подробно касаться не будуУж будь добр, а то я из-под стола до вечера не вылезу, а Изопропил попкорном подавится. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 15:17 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
(4) Чито ? как интерфейс может инкапсулировать в себе тип ? Какой тип инкапсулирует в себе интерфейс IEnumerable ? Интерфейс инкапсулирует в себе поведение. Класс, реализующий интерфейс говорит, что он обязуется вести себя так как указанно. Это, в частности, поможет "избежать межклассовой зависимости в логике" (inversion of control), но и не только. Это не единственная функция интерфейсов. (5) Класс называется абстрактным, всего лишь потому, что у него есть абстрактные методы. Но у него есть и обычные методы. Вот их и надо тестировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 15:18 |
|
Как юнит-тестить абстрактные классы ?
|
|||
---|---|---|---|
#18+
Спиридончик(4) Чито ? как интерфейс может инкапсулировать в себе тип ? Какой тип инкапсулирует в себе интерфейс IEnumerable ?школие имел ввиду интерфейс == тип. Объектный тип. Объектный тип может описывать поведение, никаких противоречий. Спиридончик(5) Класс называется абстрактным, всего лишь потому, что у него есть абстрактные методы. Но у него есть и обычные методы. Вот их и надо тестировать.Класс называется абстрактным потому что не порождает объектов. Абстрактных методов у него может и не быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 15:22 |
|
|
start [/forum/topic.php?fid=20&msg=38268202&tid=1404646]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 185ms |
0 / 0 |