2012-12-27 10 views
5

私はレールコントローラ仕様でいくつかの共通コードを再利用しようとしています。管理者ユーザーと一般ユーザーのコンテキストが異なります。しかし、行動の多くは、特定のアクションのと同じであるので、私はヘルパー関数に出ている一般的な振る舞いを引いてみました:私は何をやっている異なるrspecコンテキストでのコードの再利用

undefined local variable or method `common_get_new'

describe SomeController do 
    def common_get_new 
     # common stuff 
    end 

    context "regular users" do 
     describe "GET new" do 
      common_get_new 
     end 
    end 

    context "admin users" do 
     describe "GET new" do 
      common_get_new 
     end 
    end 
end 

これは私にエラーを与えます違う?

+0

common_get_newとは何か - セットアップの内容、すべきこと、全体の例、その他何か? –

+0

@FrederickCheungセットアップに必要なものは含まれていません。それにはいくつかの例があります。 – mushroom

答えて

13

あなたはShared Examplesを使用してみましたか?

describe SomeController do 
    shared_examples_for "common_get_new" do 
    # common stuff 
    end 

    context "regular users" do 
    describe "GET new" do 
     it_should_behave_like "common_get_new" 
    end 
    end 

    context "admin users" do 
    describe "GET new" do 
     it_should_behave_like "common_get_new" 
    end 
    end 
end 

あなたの質問にごcommon_get_new方法である内容に応じて、単にあなたのエラーを取り除くために、あなたは仕様/サポート/ utilities.rb方法を置くことができ、または@クリスのようにしてください。 Healdは、ファイルの先頭にメソッドを提案して定義します。

+0

spec/support/utilities.rbのヒントをありがとう! –

+0

誰かが共有の例にパラメータを渡す方法を探しているなら: 'shared_examples_for" common_perf_test "do |名前、メッセージ| ' 'は "#{name}"をputし、共有例を次のように呼び出します: 'it_should_behave_like" common_perf_test "、"#{description} "、message' –

0

深いコンテキストが同じセットアップコードを共有できるようにコンテキストを再配置してみてください。

describe SomeController do 
    describe "GET new" do 
    before do 
     # common stuff 
    end 

    context "regular users" do 
    end 

    context "admin users" do 
    end 
    end 
end 
+1

これは私の問題は、私が実際にセットアップ作業ではないということです。仕様の特定のセクションは異なるコンテキストで同じです。コピーして貼り付けるのではなく、セクションを再利用したいと思います。これを行う方法は? – mushroom

+0

あなたのメソッドをファイルの最上位レベルで定義します。 'describe'または' context'ブロックの中ではありません。 –

関連する問題