什么是ObjectMother?

时间:2009-05-28 21:35:25

标签: unit-testing design-patterns

什么是ObjectMother以及此模式的常见使用方案是什么?

3 个答案:

答案 0 :(得分:22)

  

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

     

使用ObjectMother的一些原因:
  *减少测试中的代码重复,提高测试可维护性   *使测试对象易于访问,鼓励开发人员编写更多测试   *每次测试都以新数据运行   *测试总是在他们自己清理之后。

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

答案 1 :(得分:7)

有关使用Test Data Builder而不是Object Mother的原因的参数,请参阅“Test Data Builders: an alternative to the Object Mother pattern”。它解释了两者是什么。

答案 2 :(得分:2)

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

它们非常有用的地方是生成复杂的对象,其中数据对测试没有特别的意义。

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

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

你会使用ObjectMother

中合理的一个
    Order motherOrder = ObjectMother.SimpleOrder();
    _orderProcessor.Process(motherOrder);

这往往有助于被测试的类开始依赖传入的合理对象的情况。

例如,如果您向上面的Order类添加了一些OrderNumber验证,您只需要在SimpleObject类上实例化OrderNumber,以便所有现有测试都通过,让您专注于编写验证测试。 / p>

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

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

另一个建议的行为是为您的方法使用良好的描述性名称,以促进重用。每次测试都很容易得到一个对象,这绝对是可以避免的。最好生成表示一般而非特定属性的对象,然后为您的测试进行自定义。例如ObjectMother.WealthyCustomer()而不是ObjectMother.CustomerWith1MdollarsSharesInBigPharmaAndDrivesAPorsche()和ObjectMother.CustomerWith1MdollarsSharesInBigPharmaAndDrivesAPorscheAndAFerrari()