我尝试使用RSpec2测试一个类,它有一些私有方法,这些方法是从一些公共方法调用的。我用
测试公共方法@foo.should_receive(:start_training).exactly(2).times
如果他们被召唤以及频率如何。我的问题是,这种方法不适用于私有方法。那么,有没有什么方法可以像@foo.send(:private_method)
一样使用should_receive
?或者任何其他语法?
答案 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
找到有关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")