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 和规范示例,看起来有可能提出一些可以解决问题的扩展,但是是否已经存在任何东西?

4

2 回答 2

3

Machine.Specifications项目有这个想法,你可以在其中指定一个具有 Behaviors 属性的类,然后在另一个类中,指定

Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;

在规范中不止一次,允许您从任意数量的类继承行为。当来自传统的单元测试背景时,这种风格需要一段时间才能适应,但它确实支持这种行为。如果您下载该项目并查看示例,您将看到一个带有行为的示例。

于 2009-11-04T12:17:31.503 回答
0

使用 Linfu 你可以做 Mixins: http: //www.codeproject.com/KB/cs/LinFuPart2.aspx

但我不确定的是,BDD 框架是否能很好地与 LinFu 动态对象配合使用。

我自己还没有机会使用 LinFu 的 Mixins,所以有兴趣了解它们在中等复杂的场景中使用时的简单/复杂程度以及是否存在任何主要缺点。

于 2009-11-03T16:51:39.733 回答