RSpec

时间:2015-11-30 01:22:03

标签: ruby rspec

假设我有一个班级

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方法也存在,但是我可以用它来产生参数并修改它们,然后用新修改的参数调用原文吗?

或者有没有办法在块中“取消”对象,所以我再次调用它不会导致问题?

谢谢!

1 个答案:

答案 0 :(得分:3)

使用and_wrap_original

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")