31

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

@foo.should_receive(:start_training).exactly(2).times

如果他们被调用以及多久调用一次。我的问题是,这种方法不适用于私有方法。那么,有什么方法可以@foo.send(:private_method)结合使用 sth likeshould_receive吗?或者任何其他语法?

4

4 回答 4

34

should_receive(:method)无论 的可见性:method是公开的还是私有的,都可以使用。

于 2013-02-20T18:24:38.940 回答
23

您可以使用allow_any_instance_of方法来存根或模拟类的任何实例,例如,您有一个带有一些方法的class命名,而不是您可以执行类似这样的操作Fooprivate

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()中找到有关方法的更多详细信息

于 2016-07-26T10:25:50.297 回答
2

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

于 2013-02-20T18:23:37.963 回答
0

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

好的是:您可以制作自己的方法protected,然后以通常的方式对其进行存根;

allow_any_instance_of(described_class).to(
  receive(:my_protected_method_name).and_return("foo_bar")
)
于 2019-10-09T08:13:09.687 回答