我应该使用RSpec测试私有方法吗?

时间:2013-04-24 16:29:04

标签: ruby rspec private-methods

为私有方法编写测试是不错的做法?

考虑以下简单示例:

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)有时不赞成。

2 个答案:

答案 0 :(得分:29)

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

如果在某个时刻你对长私有方法感到不舒服,那可能是因为你有机会将这个逻辑拉到课外并构建另一个模块或类。然后,您可以对其进行单元测试,仅对其界面进行单元测试,即其公共方法。

在极少数情况下,有必要测试私有方法,因为整个内部逻辑非常复杂,并且您想要分解问题。但是在99.9%的情况下,测试私有方法是一个坏主意。

答案 1 :(得分:17)

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

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

她说如果你愿意,你可以测试你的私人方法,但你应该担心的唯一测试是测试公共接口的测试。否则,您可能会过于紧密地实现。

我认为,如果您对未经测试的复杂私有方法感到紧张,那么在分拆服务和价值对象并将其置于测试中时,toch的观点也是一个很好的选择。