0

RSpecのモックとスタブにRRを使用していますが、いくつかのインスタンス変数を設定するコントローラーのスーパークラスからメソッドをスタブしたいという状況に遭遇しました。メソッド呼び出しをスタブする方法を理解できます。デバッグすると、スタブされたブロックが呼び出されていることがわかりますが、ブロック内のインスタンス変数を取得して、テストしているクラスに伝播させることはできません。

分解するだけです:

class A < ApplicationController
  before_filter :bogglesnap

  def bogglesnap
    @instancevar = "totally boggled"
  end
end

class B < A
  def do_something_with_instance
    if @instancevar 
      ....
    else
      ....
    end
  end
end

これが基本的な設定なので、コントローラーBのテストでは、bogglesnapメソッドをAからスタブして、@instancevarを必要なものに設定したいと思います。どうすればいいのかわからない。

RRのinstance_ofスタブを試し、コントローラー定義をスタブアウトしました。

stub.instance_of(A).bogglensap { @instancevar = "known value" }
stub(controller).bogglesnap { @instancevar = "known value" }

しかし、これらはどちらも機能していないようです、まあ、機能しません:)

そのメソッド呼び出しをスタブしてインスタンス変数を設定する方法について、誰かがポインターを持っていますか?私はそれがブロックが実行されているコンテキストに関係していると思いますが、誰かが以前にこのようなものに遭遇したことを望んでいます。

ありがとう

4

1 に答える 1

2

instance_variable_setオブジェクトインスタンスを呼び出してメソッドを使用し、必要なものに設定できます。

 controller.instance_variable_set("@instancevar", "known value")

同様に、仕様またはデバッグでインスタンス変数の値を取得したい場合、またはクラスの外から何か他のことをしたい場合は、次のようにして値を取得できます。

 controller.instance_variable_get("@instancevar")

なお、 Ruby が提供しているためinstance_variable_setinstance_variable_getメソッドはコントローラーだけでなく、すべてのオブジェクトで使用できます。実際、これらの 2 つのメソッドは Rails マジックで重要な役割を果たします :)

于 2010-02-23T05:49:52.690 に答える