2009-11-02 77 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

我不知道,虽然什么,如果是在BDD框架将与李林甫动态对象发挥很好。

我还没有机会亲自使用LinFu的Mixins,因此有兴趣听到它们在复杂的情况下使用有多简单/复杂,以及是否存在任何主要缺点。