1

在简单的代码中使用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来源,但我稍后会这样做;)


  • 红宝石 1.9.3p194
  • 测试单元 2.5.0、2.4.8
  • 摩卡咖啡 0.12.6
4

3 回答 3

1

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

正如您所建议的,了解这里发生的事情的一种方法是检查 Mocha 来源。我认为问题的关键在于Expectation创建存根时使用的类利用了caller方法本身

一种解决方法是使用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)
于 2012-10-18T10:16:46.267 回答
0

callerm. caller.first呼叫的线路总是如此,m这可能是无用的。可能您想要的是caller[1],而不是caller.first(或caller[0])。

于 2012-10-18T10:44:53.360 回答
0

这个怎么样?

allow_any_instance_of(Kernel)
  .to receive(:caller)
  .and_return(["anything_you_want.rb"])
于 2022-03-03T21:53:26.677 回答