我们很多的系统测试都是采用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和规范示例,看起来可以想出一些扩展程序来完成这项工作,但是否已经存在类似的东西呢?