2013-02-20 67 views
7

我尝试使用RSpec2测试一个类,该类有一些私有方法,这些方法是从一些公共方法调用的。我测试公共方法RSpec:存根专用方法

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

如果他们被调用和多久。我的问题是,这种方法不适用于私人方法。那么,有没有办法像@foo.send(:private_method)should_receive一起使用?或者其他语法?

回答

10

should_receive(:法)的作品是否:方法是公共的或私人...

+1

eehmm ...我相信它的工作原理。你能解释一下你的意思吗? – 23tux 2013-02-20 18:32:23

+0

我试过了,当我试着用私有方法调用should_receive时,我得到'私有方法'start_training'调用#<运行:0x007f7f7e2ebe68>' – 23tux 2013-02-20 19:14:16

+0

你可以发布多一点的代码吗?在规范我正在atm工作,我should_receive'ing私人方法,没有问题... – 2013-02-20 20:44:17

0

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

+6

我非常肯定它值得测试私有方法。否则,如果你有10个公共方法依赖于这个私有方法,那么你最终可能会重复自己测试所有这些方法公有的行为。 – 2014-04-09 15:33:02

+1

@AndréHerculano是的,但你应该测试行为,而不是执行。无论使用什么私有方法,您都会测试这些公共方法的回报。 – 2015-06-16 16:45:39

5

您可以使用allow_any_instance_of方法存根或嘲笑的一类 的任何实例如你有一个class名为Foo一些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()方法的详细信息Official Documentation