代码之家  ›  专栏  ›  技术社区  ›  Greg Beech

是否有允许多种继承行为的BDD风格框架?

  •  3
  • Greg Beech  · 技术社区  · 15 年前

    我们的许多系统测试都是以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不支持多重继承或混合,所以我们最后编写了一堆Boiler-Plate方法,将调用转发到其他行为,这些行为每次改变都需要改变。

    我们真正需要的是一个框架,它有自己的机制来支持测试中的多种行为,只需提供应该观察到的其他行为类型。我一直在研究Xunit和规范示例,看起来可能会对其进行一些扩展,从而实现这一技巧,但是是否已经存在了什么?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Deeksy    15 年前

    这个 Machine.Specifications Project有这样的想法,您可以在其中使用行为属性指定一个类,然后在另一个类中指定

    Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;
    

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

        2
  •  0
  •   LondonBasedEngineer    15 年前

    使用Linfu可以进行混合: http://www.codeproject.com/KB/cs/LinFuPart2.aspx

    不过,我不确定的是,BDD框架是否能很好地处理Linfu动态对象。

    我自己还没有机会使用Linfu的混音器,所以我有兴趣了解在中等复杂的场景中使用混音器有多简单/复杂,以及是否存在任何重大缺陷。