0

私が取り組んでいるコントローラのテストがあります。基本的に、コントローラーは次のようになります。

before_filter :set_up_foo

def set_up_foo
  ...
  @foo = SomeObject.create(params[:some_object_attributes])
  ...
end

def some_action
  # reference @foo
  if @foo.nil?
    ...
  else
    # this is what I want to test
    ...
  end
end

before フィルターではなく、else ブロックの内部をテストしたくありません。私の場合、実際に before フィルターを実行するためにモックしなければならないモデル オブジェクトが大量にあります。そのための別のテストがあります。before フィルターの「副作用」が実行されることを確認したい...この場合、 @foo はそのモックバージョンに初期化されます。

基本的に私はやりたい:

controller.foo = mock_foo_object

しかし、これは機能しません。私も試しました:

controller.stub!(:foo).and_return(mock_foo_object) 

私は(笑)これがうまくいくと思っていましたが、うまくいきませんでした。私が得た唯一の実際のフィードバックは、@foo オブジェクトが設定されておらず、その結果、else 条件ではなく if 条件が得られたということです。

どんな助けでも大歓迎です...

4

1 に答える 1

0

だから私はこの解決策を見つけました:アクセサーをモックする代わりに、副作用のあるメソッドのスタブにブロックを渡して、その副作用を行うことができます:

controller.stub!(:set_up_foo) { controller.set_instance_variable(:@foo, @mock_foo_object) }

これには、気になる 1 つの副作用が実際に発生することを確認する効果があります。私はこれを試してみましたが、それは魅力のように機能しました。

于 2012-05-08T18:36:34.293 に答える