Существует ли структура в стиле BDD, которая допускает множественное наследуемое поведение? - PullRequest
3 голосов
/ 02 ноября 2009

Многие наши системные тесты написаны в стиле BDD, и мы прилично используем унаследованные поведения для минимизации дублирования, например, это может быть базовая иерархия для тестов на покупку.

class BehavesLikeSuccessfulPurchase
class BehavesLikePurchaseWithValidCreditCard : BehavesLikeSuccessfulPurchase

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

[Concern(typeof(Video))]
class WhenPurchasedWithValidCreditCard : BehavesLikePurchaseWithValidCreditCard

Однако, в зависимости от конкретного типа продукта, нам также необходимо провести некоторые дополнительные проверки, например, когда видео успешно приобретено, мы хотим убедиться, что оно добавлено в библиотеку видео пользователя. В идеале это может быть определено другим классом и смешано с использованием гипотетического синтаксиса:

class BehavesLikeSuccessfulVideoPurchase

[Concern(typeof(Video))]
class WhenPurchasedWithValidCreditCard : BehavesLikePurchaseWithValidCreditCard
    mixin BehavesLikeSuccessfulVideoPurchase
{
}

Но, конечно, C # не поддерживает множественное наследование или миксины, поэтому мы заканчиваем тем, что пишем множество стандартных методов, которые перенаправляют вызовы на дополнительные поведения, которые должны меняться каждый раз, когда изменяется поведение.

Что нам действительно нужно, так это фреймворк, который имеет свой собственный механизм поддержки множественных поведений из тестов, просто предоставляя тип (ы) дополнительных поведений, которые следует соблюдать. Я смотрел на xUnit и примеры спецификаций, и похоже, что было бы возможно придумать некоторые расширения, которые могли бы помочь, но есть ли что-нибудь уже существующее?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2009

Проект Machine.Specifications имеет такую ​​идею, где вы можете указать класс с атрибутом Behaviors, а затем в другом классе указать

Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;

более одного раза в спецификации, что позволяет вам наследовать поведение от любого количества классов. Этот стиль требует некоторого времени, чтобы привыкнуть к традиционному фоновому тестированию, но он поддерживает поведение. Если вы скачаете проект и посмотрите на примеры, вы увидите один с поведением.

0 голосов
/ 03 ноября 2009

Используя Linfu, вы можете делать Mixins: http://www.codeproject.com/KB/cs/LinFuPart2.aspx

В чем я не уверен, так это в том, что среда BDD будет хорошо играть с динамическими объектами LinFu.

У меня не было возможности использовать Mixin от LinFu, поэтому мне было бы интересно услышать, насколько они легки / сложны при использовании в умеренно сложном сценарии и есть ли серьезные недостатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...