假设我有一个班级
class A
def initialize
end
def foo(a, b)
# Do stuff
end
end
为此编写RSpec测试时,如何拦截对foo
的调用并修改其参数?
我可能尝试类似下面的方法来捕获方法调用,产生params以便我可以修改它们,然后调用原始方法
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
方法也存在,但是我可以用它来产生参数并修改它们,然后用新修改的参数调用原文吗?
或者有没有办法在块中“取消”对象,所以我再次调用它不会导致问题?
谢谢!
答案 0 :(得分:3)
my_obj = A.new
allow(my_obj).to receive(:foo).and_wrap_original do |original_method, a, b|
original_method.call("new", "values")
end
expect(my_obj.foo).to eq("bar")