为私有方法编写测试是不错的做法?
考虑以下简单示例:
class Group
has_many :members
private
def release_members
members.each { |member| member.update_attributes group_id: nil }
end
end
为RSpec中的release_members方法编写测试是不错的做法?我相信你必须用send发出调用方法的测试。 group.send(:release_members)
有时不赞成。
答案 0 :(得分:29)
您不应该测试私有方法,因为它们属于类的内部机制。单元测试的目的是在通过其接口(即其公共方法)进行交互时检查您的类是否按预期运行。
如果在某个时刻你对长私有方法感到不舒服,那可能是因为你有机会将这个逻辑拉到课外并构建另一个模块或类。然后,您可以对其进行单元测试,仅对其界面进行单元测试,即其公共方法。
在极少数情况下,有必要测试私有方法,因为整个内部逻辑非常复杂,并且您想要分解问题。但是在99.9%的情况下,测试私有方法是一个坏主意。
答案 1 :(得分:17)
您可以在Sandi Metz演讲的这些幻灯片中找到对该主题的深入讨论。
https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf
她说如果你愿意,你可以测试你的私人方法,但你应该担心的唯一测试是测试公共接口的测试。否则,您可能会过于紧密地实现。
我认为,如果您对未经测试的复杂私有方法感到紧张,那么在分拆服务和价值对象并将其置于测试中时,toch的观点也是一个很好的选择。