如何规范私有方法

时间:2010-11-11 12:32:11

标签: ruby-on-rails rspec

我得到了一个带有私有方法的模型,我想用RSpec来规定,
你平时怎么做? 您是否只测试调用私有方法的方法?
还是私人的?如果是的话,你怎么办?

3 个答案:

答案 0 :(得分:115)

我总是采用这种方法:我想测试我的类公开的公共API。

如果您有私有方法,则只能从公开给其他类的公共方法中调用它们。因此,如果您测试那些公共方法在所有条件下都按预期工作,您还证明了它们使用的私有方法也可以工作。

我承认我遇到过一些特别复杂的私人方法。在极端情况下,您想测试它们,您可以这样做:

@obj.send(:private_method)

答案 1 :(得分:6)

对于需要代码覆盖的私有方法(临时或永久),使用rspec-context-private gem临时在上下文中公开私有方法。

gem 'rspec-context-private'

它的工作原理是为项目添加共享上下文。

RSpec.shared_context 'private', private: true do

  before :all do
    described_class.class_eval do
      @original_private_instance_methods = private_instance_methods
      public *@original_private_instance_methods
    end
  end

  after :all do
    described_class.class_eval do
      private *@original_private_instance_methods
    end
  end

end

然后,如果您将:private作为元数据传递给describe块,则私有方法将在该上下文中公开。

class Example
  private def foo
    'bar'
  end
end

describe Example, :private do
  it 'can test private methods' do
    expect(subject.foo).not eq 'bar'
  end
end

答案 2 :(得分:0)

如果您想要测试对私人方法的期望,那么接受的答案将无法正常工作(至少不是我所知道的,所以我可以对此进行更正)。我所做的甚至更肮脏 - 在测试本身,只需通过重新定义它来揭示方法:

def object_to_test.my_private_method
  super
end

适用于Ruby 1.8,无法评论任何较新的运行时。