2016-12-11 11 views
0

私はWebアプリケーションのいくつかのテストを書いていますが、コントローラの1つがScopeオブジェクトのresolveを呼び出します。これは若干修正されたスコープを返します。テストでは、元のスコープ(パラメータとしてScope.initializeに渡された)を返すようにこのメソッドをスタブしたいと思います。スタブ中にオブジェクトのインスタンス変数にアクセスする方法は?

Scopeオブジェクト

class Scope 

    def initialize(scope) 
    @scope = scope 
    end 

    def resolve 
    # Return a modified scope. 
    end 
end 

コントローラ

class FooController < ApplicationController 

    def show 
    foos = Scope.new(Foo.some_foos).resolve 
    respond_with foos 
    end 
end 

試験

it "does something" do 
    allow_any_instance_of(Scope).to receive(:resolve).and_return(???.scope) 
    get :show 
    # Do some assertions. 
end 

Scopeのインスタンスに対してresolveメソッドをスタブするために、???のどこに配置する必要がありますか?作成された元のスコープを返すにはどうすればよいですか?

私はRspec 3.4.2を使用しています。

答えて

1

まずあなたがinstance_variable_getを使用せずに@scopeにアクセスできるように、スコープに属性リーダーを作成することになるでしょう:

class Scope 

    attr_reader :scope 

    def initialize(scope) 
    @scope = scope 
    end 

    def resolve 
    # Return a modified scope. 
    end 
end 

あなたはブロックの実装を使用する場合、受信機は最初の引数として渡されます。

allow_any_instance_of(Scope).to receive(:resolve) do |s| 
    s.scope 
end 

しかし、allow_any_instance_ofを使用することは強く推奨されません。通常は、コントローラが実際にはtesting their behavior in a future proof wayの代わりに自分のコントローラをどのようにして動作させるかがあまりにも多くの場合、

代わりに、Scopeをテストするユニットテストを使用して、コントローラをフィーチャ仕様と組み合わせてテストする仕様を要求します。これは、Punditを使用するアプリケーションをテストする方法であり、堅牢な戦略です。

関連する問題