2016-10-09 10 views
2

RSpecの共有の例に定義された変数を使用する際に問題があります。私のテストは次のとおりです:RSpecは共有の例で定義された変数を使用できません

RSpec.shared_examples "check user logged in" do |method, action, params| 
    it "redirects to the sign in page if the user is not logged in" do 
    send(method, action, params) 
    expect(response).to redirect_to(signin_url) 
    end 
end 

RSpec.describe UsersController, type: :controller do 
    describe "GET #show" do 
    let(:user) { FactoryGirl.create(:user) } 
    let!(:show_params) do 
     return { id: user.id } 
    end 

    context "navigation" do 
     include_examples "check user logged in", :get, :show, show_params 
    end 
    end 
end 

このテストでは、アクションが実行される前にログインする必要があることを確認しています。

method_missing ':私は、次のエラーメッセージを受信して​​いshow_paramsが

は私がshow_paramsにアクセスできるように変更する必要がある例グループでは使用できませんか?私はinclude_examplesの代わりにit_behaves_likeを使ってみました。私はまた、context "navigation"ブロックを無駄に削除しようとしました。複数のコントローラーとアクションでこのチェックを実行する必要があるので、コードを再利用する正しい方法が共有されているようです。

答えて

3

ここでの問題は、メモ化されたletヘルパーshow_paramsが例外で呼び出されることです。

RSpec.describe UsersController, type: :controller do 
    let(:user) { FactoryGirl.create(:user) } 
    describe "GET #show" do 
    let(:action) { get :show, id: user } 
    it_should_behave_like "an authorized action" 
    end 
end 

RSpec.shared_examples "an authorized action" do 
    it "denies access" do 
    action 
    expect(response).to redirect_to(signin_url) 
    end 
end 

これは、あなたがするので、構成アプローチ上の規則を使用することができますかなり強力なパターンは次のとおりです。

代わりのparamsを渡すあなたは単にあなたが例を含めている外側のスコープからletを参照することができますlast let always wins

+0

これは美しく機能しました。どうもありがとうございました!私は別のファイル( 'spec/controllers/shared_examples/authorized_action.rb')に共有サンプルを置いて、' spec/rails_helper.rb'のディレクトリを必要とし、それをあなたの提案どおりに使いました! – Alexander

関連する問題