如何规范一个私人的方法

我有一个私人的方法模型,我想用RSpec规范,
你通常怎么做? 你只testing调用私人的方法吗?
或者也是私人的? 如果是这样,你好吗?

我总是采取这种方法: 我想testing我的类公开的API。

如果你有私有方法,你只能从公开的方法调用它们到其他类。 因此,如果你testing这些公共方法在所有条件下都能按预期工作,那么你也certificate了他们使用的私有方法也是可行的。

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

@obj.send(:private_method) 

对于需要代码覆盖的私有方法(暂时或永久),请使用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 

如果你想testing一个私人方法的期望,接受的答案是不会真的工作(至less不是我所知道的,所以我打开纠正这一点)。 我所做的事情甚至更糟糕 – 在testing本身中,只是通过重新定义方法来暴露方法:

 def object_to_test.my_private_method super end 

在Ruby 1.8上工作,不能评论任何新的运行时。