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

tyl*_*mos 26 ruby rspec private-methods

为私有方法编写测试是一种好习惯吗?

考虑以下简单示例:

class Group
  has_many :members

  private

  def release_members
    members.each { |member| member.update_attributes group_id: nil }
  end
end
Run Code Online (Sandbox Code Playgroud)

在RSpec中为release_members方法编写测试是不错的做法?我相信你必须用send发出调用方法的测试.group.send(:release_members)这有时令人不悦.

toc*_*och 30

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

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

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


Joe*_*ejr 18

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

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

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

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