【问题标题】:Is there a BDD-style framework that allows multiple inherited behaviours?是否有允许多个继承行为的 BDD 样式框架?
【发布时间】: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


    【解决方案1】:

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

    Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-04
        • 1970-01-01
        • 2012-12-14
        • 1970-01-01
        • 2012-06-08
        • 2019-03-08
        • 1970-01-01
        • 2011-03-16
        相关资源
        最近更新 更多