我们的许多系统测试都是用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#不支持多重继承或mixins,所以我们最终会编写一大堆锅炉板方法来转发对其他行为的调用,每次行为发生变化时都需要更改。
我们真正需要的是一个框架,它有自己的机制,可以简单地通过提供应该观察到的其他行为的类型来支持测试中的多个行为。我一直在关注xUnit和规范示例,看起来有可能想出一些可以做到这一点的扩展,但是有什么已经存在吗?
答案 0 :(得分:3)
Machine.Specifications项目有这个想法,您可以在其中指定具有Behaviors属性的类,然后在另一个类中指定
Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;
在规范中不止一次,允许您从任意数量的类继承行为。从传统的单元测试背景来看,这种风格需要一段时间才能习惯,但它确实支持这种行为。如果您下载项目并查看示例,您将看到一个包含行为的内容。
答案 1 :(得分:0)
使用Linfu你可以做Mixins:http://www.codeproject.com/KB/cs/LinFuPart2.aspx
但我不确定的是,BDD框架是否可以很好地与LinFu动态对象配合使用。
我自己没有机会使用LinFu的Mixins,所以有兴趣听一下在中等复杂情况下使用它们有多简单/复杂,以及是否有任何重大缺点。