2009-11-02 1 views
3

Многие из наших системных тестов написаны в стиле BDD, и мы делаем достойное использование унаследованных действий для минимизации дублирования, например, это может быть базовая иерархия для тестов на покупку.Есть ли в стиле 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 и примеры спецификации, и похоже, что можно было бы придумать некоторые расширения, которые могли бы сделать трюк, но есть ли что-нибудь уже существующее?

ответ

3

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

Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour; 

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

0

Использование Линьфу вы можете сделать Примеси: http://www.codeproject.com/KB/cs/LinFuPart2.aspx

То, что я не уверен, однако, является ли структура БДД будет играть хорошо с Линьфу динамическими объектами.

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

Смежные вопросы