什么是ObjectMother以及此模式的常见使用方案是什么?
答案 0 :(得分:22)
ObjectMother从工厂模式开始,通过简单的方法调用提供预制的测试就绪对象。它超越了工厂的范围 促进创建对象的自定义, 提供在测试期间更新对象的方法,以及 如有必要,在测试完成时从数据库中删除该对象。
使用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()