摩卡:为什么我不能存根#caller方法?

时间:2012-10-18 09:20:08

标签: ruby mocha

在简单代码中使用Mocha以意想不到的方式转换。你能解释一下出了什么问题吗?

require 'test-unit'
require 'mocha'

class A
  def m
    caller.first
  end
end

因此,使用这个简单的类,我们可以得到最新的调用者:

A.new.m #=> "(irb):32:in `irb_binding'" (for example)

但是,如果我想要发送caller电话,那就会出错。

a = A.new
a.stubs(:caller)

Mocha::ExpectationError: unexpected invocation: #<A:0x6aac20>.caller()

我的猜测是查看Mocha来源,但我稍后会这样做;)


  • ruby​​ 1.9.3p194
  • test-unit 2.5.0,2.4.8
  • mocha 0.12.6

2 个答案:

答案 0 :(得分:1)

这是部分解释,但我希望它仍然有用。

正如您所建议的,了解这里发生的事情的方法是检查Mocha来源。我认为问题的关键在于Expectation类,它在创建存根时使用makes use of the caller method itself

解决方法是使用alias_method例如

class A
  alias_method :my_caller, :caller # allow caller to be stubbed

  def m
    my_caller.first
  end
end

a = A.new
a.stubs(:my_caller)

答案 1 :(得分:0)

您正在caller致电m。因此caller.first始终是调用m的行,这可能是无用的。可能你想要的是caller[1],而不是caller.first(或caller[0])。