【发布时间】:2016-03-03 14:10:44
【问题描述】:
假设我有一堂课
class A
def initialize
end
def foo(a, b)
# Do stuff
end
end
在为此编写 RSpec 测试时,如何拦截对 foo 的调用并修改其参数?
我可能会尝试以下类似的方法来捕获方法调用,生成参数以便我可以修改它们,然后调用原始方法
my_obj = A.new
allow(my_obj).to receive(:foo) do |a, b|
my_obj.foo("new", "values")
end
expect(my_obj.foo).to eq("bar")
但是,这样做的问题是在块内再次调用A#foo 会对该块进行存根并产生一个新块,从而产生无限递归循环,直到堆栈内存不足。
我知道.and_call_original 方法也存在,但我可以用它产生参数并在使用新修改的参数调用原始参数之前修改它们吗?
或者有没有办法“取消存根”块内的对象,所以我再次调用它不会导致问题?
谢谢!
【问题讨论】: