有没有一种BDD风格的框架,可以允许多个继承行为?

3

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

3

Machine.Specifications项目有这样的想法,您可以使用Behaviours属性指定一个类,然后在另一个类中指定...

Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;

在规范中可以多次使用,允许您从尽可能多的类中继承行为。如果您来自传统的单元测试背景,则需要一些时间适应这种风格,但它确实支持该行为。如果您下载该项目并查看示例,您将看到其中一个带有行为的示例。

0

使用 Linfu,您可以进行 Mixins:http://www.codeproject.com/KB/cs/LinFuPart2.aspx

但是我不确定 BDD 框架是否与 LinFu 动态对象兼容。

我自己还没有机会使用 LinFu 的 Mixins,所以很想听听它们在中等复杂场景中使用时的易用性和复杂性,以及是否有任何主要缺点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接