【发布时间】:2010-12-12 10:13:59
【问题描述】:
我们的许多系统测试都是以 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 和规范示例,看起来可以对其进行一些扩展来解决问题,但是是否已经存在任何东西?
【问题讨论】:
标签: .net testing bdd multiple-inheritance mixins