我可以只为一个参数调用重写RSpec中的方法吗

我可以只为一个参数调用重写RSpec中的方法吗,rspec,rspec2,Rspec,Rspec2,我在几个项目中有一个功能启用机制(一个使用RSpec1和Rails2,另一个使用RSpec2/Rails3),我正在寻找一种更好的方法来覆盖一个功能,而不必对其他功能做任何事情。最后,我正在寻找一种方法,在使用特定参数调用方法时,将其存根,并在其他情况下正常运行 关闭: Project::Config.should_receive(:feature_enabled?).with('new_feature').any_number_of_times.and_return(true) get :in

我在几个项目中有一个功能启用机制(一个使用RSpec1和Rails2,另一个使用RSpec2/Rails3),我正在寻找一种更好的方法来覆盖一个功能,而不必对其他功能做任何事情。最后,我正在寻找一种方法,在使用特定参数调用方法时,将其存根,并在其他情况下正常运行

关闭:

Project::Config.should_receive(:feature_enabled?).with('new_feature').any_number_of_times.and_return(true)
get :index # calls feature_enabled? for a few other features too

>> <Project::Config (class)> expected feature_enabled? with 'new_feature' but received it with 'some old feature'
这也失败了:

Project::Config.stub(:feature_enabled?).with('new_feature').and_return(true)
get :index

>> undefined method `feature_enabled?' for Project::Config:Class

理想情况下,我可以在一行中做一些不影响其他功能的事情?电话。如果有适合RSpec2的东西,那就好了,因为我们会在某个时候更新另一个项目。

我发现调用原始方法的最佳解决方案是:

method = Project::Config.method(:feature_enabled?)

Project::Config.stub(:feature_enabled?).and_return do |arg|
  method.call(arg)
end

Project::Config.should_receive(:feature_enabled?).with('new_feature').and_return(true)

以下是RSpec 3中提供的一种可能稍微干净一点的替代方案:

allow(Project::Config).to receive(:feature_enabled?)and_wrap_original do |方法,arg|
案例arg
当“新功能”
真的
其他的
方法调用(arg)
结束
结束
如果您知道您只需要一个案例,那么您也可以使用三元甚至简单的
|

allow(Project::Config).to receive(:feature_enabled?)and_wrap_original do |方法,arg|
arg=='new_feature'|| method.call(arg)
结束

Awesome——我必须在每次运行期间存储一点额外的状态,以跟踪被覆盖的多个功能,但这非常有效。谢谢你,丹尼尔!没问题。我一直在寻找清理的方法,但唉,我还没有找到更好的方法。
method = Project::Config.method(:feature_enabled?)

Project::Config.stub(:feature_enabled?).and_return do |arg|
  method.call(arg)
end

Project::Config.should_receive(:feature_enabled?).with('new_feature').and_return(true)