代码之家  ›  专栏  ›  技术社区  ›  Oded

什么是反对者母亲?

  •  11
  • Oded  · 技术社区  · 17 年前

    什么是objectmeem,这个模式的常见使用场景是什么?

    3 回复  |  直到 17 年前
        1
  •  21
  •   David Brown Muad'Dib    17 年前

    objectmeam从工厂模式开始,通过一个简单的方法调用传递预制的测试就绪对象。它超越了工厂的范围 促进创建对象的定制, 提供在测试期间更新对象的方法,以及 如有必要,在测试完成时从数据库中删除该对象。

    使用ObjectMother的一些原因:
    *减少测试中的代码重复,提高测试可维护性
    *使测试对象非常容易访问,鼓励开发人员编写更多的测试。
    *每个测试都使用新数据运行。
    *测试总是在测试结束后进行。

    ( http://c2.com/cgi/wiki?ObjectMother )

        2
  •  7
  •   cwash    17 年前

    见“ Test Data Builders: an alternative to the Object Mother pattern “有关为什么使用测试数据生成器而不是对象母亲的参数。它解释了这两者都是什么。

        3
  •  1
  •   Modan    17 年前

    如其他地方所述,objectmeem是一个通常用于生成对象的工厂 (专用?) 用于单元测试。

    它们的主要用途是在数据对测试没有特殊意义的情况下生成复杂的对象。

    您可能在下面创建了一个空实例,例如

        Order rubishOrder = new Order("NoPropertiesSet");
        _orderProcessor.Process(rubishOrder);
    

    你应该用反对者的明智的方式。

        Order motherOrder = ObjectMother.SimpleOrder();
        _orderProcessor.Process(motherOrder);
    

    这有助于处理测试类开始依赖于传入的敏感对象的情况。

    例如,如果您向上面的order类添加了一些ordernumber验证,那么您只需要在simpleobject类上实例化ordernumber,以便通过所有现有测试,从而使您集中精力编写验证测试。

    如果您刚刚在测试中实例化了对象,那么您需要将其添加到每个测试中(我经常看到人们这样做,这让人震惊)。

    当然,这可以直接提取到一个方法中,但是将它放在一个单独的类中可以让它在多个测试类之间共享。

    另一个推荐的行为是为方法使用好的描述性名称,以促进重用。每次测试都很容易得到一个对象,这是绝对要避免的。最好生成表示常规属性而不是特定属性的对象,然后为测试定制。例如,objectmeam.wealthycustomer()而不是objectmeam.customerwith1MollarsSharesinBigPharmandDrivesAporsche()和objectmeam.customerwith1MollarsSharesinBigPharmandDrivesAporscheandFerrari()。

    推荐文章