主要是私人方法

时间:2015-01-24 11:18:51

标签: ruby rspec

我正在尝试定义大部分时间都是私有的方法,但并非总是如此。例如:

class Service

    def initialize(repo)
      @repo = repo
    end

    private def repo
      @repo
    end

    def all
      repo.all
    end
end

我的班级Service将实现存储库对象的功能。我想完全隐藏repo对象以防止它泄漏到我的生产代码中。

但是,在调试或测试时,我想要保持懒惰并直接使用service.repo致电service.send :repo

我考虑为我的测试和控制台加载类扩展或脏ENV var检查,但是如果./lib/*内的代码在使用私有方法时错误地使用私有方法,那么会阻止我的测试破坏试运行。

现在我正在探索改进,但这需要太多的样板,我想做一些像这样的装饰:

+LibPrivate
def repo
  @repo
end

这是一个Python like decorator,但我相信自Ruby 2.1以来,可以在私有/公共之外定义自定义修饰符而不用那个gem

1 个答案:

答案 0 :(得分:1)

只需在测试助手或测试文件中更改方法的可见性。

Service.class_eval do
  public :repo
end

请记住,私有方法在理论上是实现细节。你不应该测试私有方法。通常,您测试依赖于私有的第一个公共方法的行为。

如果您认为自己需要,那么该方法可能不应该是私有的。

这条规则不一定要盲目应用,但要牢记这一点是很好的。