2013-04-24 184 views
24

为私有方法编写测试是否很好?我应该使用RSpec测试私有方法吗?

考虑以下简单的例子:

class Group 
    has_many :members 

    private 

    def release_members 
    members.each { |member| member.update_attributes group_id: nil } 
    end 
end 

难道是写在RSpec中的release_members方法测试好的做法呢?我相信你必须编写测试调用发送ie的方法。 group.send(:release_members)这是有时皱起了眉头。

+1

看来,红宝石流氓有一个由桑迪梅斯播客,在这里谈论这个话题http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi-梅斯/。我们的观点是,如果你喜欢,你可以测试私有方法(最终甚至可以删除测试),但最重要的是调用私有方法的公共接口。 – 2013-04-24 16:33:00

回答

17

您可以在Sandi Metz演讲的这些幻灯片中找到有关该主题的深入讨论。

https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf

她说,你可以试驾您的私有方法,如果你喜欢,但你应该担心的唯一的测试是那些测试的公共接口。否则,你可能会与实现紧密结合。

我认为这一点通过TOCH上分裂出去的服务和价值目标,并把那些在测试中也是,如果你正在担心未测试复杂的私有方法是好的。

+0

感谢您指向我的链接。看起来像一个伟大的资源! – 2013-04-24 17:03:13

+1

链接已损坏。 – Oin 2014-03-21 10:42:10

28

您不应该测试私有方法,因为它们属于类的内部机制。单元测试的目的是检查你的类在通过它的接口(即它的公共方法)进行交互时是否按预期行事。

如果在某一点上你长的私有方法不舒服,可能是因为你在这里有机会扳指逻辑类外另筑模块或类。然后,您可以对其进行单元测试,并再次仅对其界面进行测试,即其公共方法。

在某些罕见的情况下,有必要测试的私有方法,因为整个内部逻辑是非常复杂的,你想分裂的问题。但在99.9%的情况下,测试私有方法是一个糟糕的主意。

+0

具有很多意义。它不是可选的,它不应该被测试给机会自由地调整他们并且只有当它打破外部API时担心。 – 2014-05-09 19:08:48