【问题标题】:Stubbing method parameters in RSpecRSpec 中的存根方法参数
【发布时间】: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 方法也存在,但我可以用它产生参数并在使用新修改的参数调用原始参数之前修改它们吗?

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

谢谢!

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2011-12-21
      • 2012-10-24
      • 2014-09-23
      • 2013-08-22
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多