26

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

考虑以下简单示例:

class Group
  has_many :members

  private

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

在 RSpec 中为 release_members 方法编写测试是一种好习惯吗?我相信你必须编写测试调用发送即方法的方法。group.send(:release_members)这有时是不受欢迎的。

4

2 回答 2

30

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

如果在某个时候你对长的私有方法不满意,那可能是因为你有机会将这个逻辑拉到类之外并构建另一个模块或类。然后,您可以对它进行单元测试,同样只测试它的接口,即它的公共方法。

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

于 2013-04-24T16:36:13.637 回答
21

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

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

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

如果您对未经测试的复杂私有方法感到紧张,我认为逐点拆分服务和价值对象并将它们置于测试之下也是一个好方法。

于 2013-04-24T16:52:05.673 回答