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

これは部分的な説明ですが、それでも役立つことを願っています。

あなたが提案したように、ここで何が起こっているのかを理解する方法は、モカの情報源をチェックすることです。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

callerから電話してmいます。caller.firstそのため、 を呼び出す行は常に になりますが、これmはおそらく役に立たないでしょう。おそらくあなたが望んでいたのは、 (または)caller[1]ではなく、です。caller.firstcaller[0]

于 2012-10-18T10:44:53.360 に答える