RSpec:Stub私有方法

时间:2013-02-20 18:21:14

标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec2

我尝试使用RSpec2测试一个类,它有一些私有方法,这些方法是从一些公共方法调用的。我用

测试公共方法
@foo.should_receive(:start_training).exactly(2).times

如果他们被召唤以及频率如何。我的问题是,这种方法不适用于私有方法。那么,有没有什么方法可以像@foo.send(:private_method)一样使用should_receive?或者任何其他语法?

4 个答案:

答案 0 :(得分:21)

should_receive(:method)是否有效:方法是公共的还是私有的......

答案 1 :(得分:10)

您可以使用allow_any_instance_of方法来存根或模拟任何类的实例 例如你有一个名为class Foo的{​​{1}}方法,而private方法可能会比这样做

allow_any_instance_of(Foo).to receive(:private_method) do
  #do something
end 

如果你还有module,你可以做这样的事情

allow_any_instance_of(Module::Foo).to receive(:private_method) do
  #do something
end

您可以在Official Documentation

找到有关allow_any_instance_of()方法的更多详细信息

答案 2 :(得分:2)

为什么要测试私有方法?出于某种原因,他们是私人的;防止来自外部呼叫的访问。测试依赖私有方法的公共方法就足够了。

答案 3 :(得分:-1)

坏消息是:您不能存根私有方法

一个不错的方法是:您可以创建方法protected,然后按常规方式对其进行存根

allow_any_instance_of(described_class).to receive(:my_protected_method_name).and_return("foo_bar")