2011-09-17 14 views
16

rspecテストコントローラでdevise認証に問題があります。私merchants_controller_spec.rbで、私は私のspec_helper.rbにrspecコントローラのテストでデバイス認証

config.include Devise::TestHelpers, :type => :controller 

が含まれている

私は次のセットアップ

を持って

describe MerchantsController do 
    before :each do 
    @user = Factory(:user) 
    @merchant = Factory(:merchant, :user_id => @user.id,:is_approved => false, :is_blacklisted => false) 
    controller.stub!(:current_user).and_return(@user) 
    end 
    describe "GET index" do 
    it "assigns all merchants as @merchants" do 
     merchant = Factory(:merchant,:is_approved => true, :is_blacklisted => false) 
     get :index 
     assigns(:merchants).should eq([merchant]) 
    end 
    end 
end 

マイmerchants_controller.rb

class MerchantsController < ApplicationController 

    before_filter :authenticate_user! 
    def index 
    @merchants = Merchant.approved 
    debugger 
    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @merchants } 
    end 
    end 
end 

私は商人のモデルに

scope :approved, where(:is_approved => true, :is_blacklisted => false) 

を承認した範囲は今、私の問題は、私はCURRENT_USERをスタブとCURRENT_USERとして@user返され、私のmerchants_controllerインデックス仕様が失敗しているにもかかわらず、である持っています。しかし、私がauthenticate_userをコメントアウトすれば!仕様が合格、

authenticate_userなし!インデックスアクションのデバッガが捕捉されますが、authenticate_userを使用します。デバッガは捕捉されません。

current_userの下位に問題があると思いますが、それを把握することはできません。

答えて

22

あなたはgithub上のドキュメントを読んで持って...私を助けて:?

考案は、機能仕様のためのいくつかのテストヘルパーが含まれています。それらを使用するには、テストクラスにDevise::TestHelpersを含めるだけで、sign_insign_outメソッドを使用する必要があります。このような方法は、コントローラと同じシグネチャを持つ:

sign_in :user, @user # sign_in(scope, resource) 
sign_in @user   # sign_in(resource) 

sign_out :user   # sign_out(scope) 
sign_out @user   # sign_out(resource) 
+1

私はcontroller.stubを置き換え:sign_inの@userと.and_return(@user) が、それでも(CURRENT_USERを)!私の問題は解決しません。私は、インデックスアクション内のデバッガはまだ捕らえられていないので、ユーザーはまだ認証されていないと思います。何か案は? – Gagan

+0

私はこれを2回upvoteできますことを願っています。私は私の管理者を作成するネストされた工場を持っていた、と私はなぜユーザーが作成されていたが、ログインしていない把握することができませんでした。 – Arel

2

別の代替

RSpec.describe YourController, :type => :controller do 
    before do 
    user = FactoryGirl.create(:user) 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    allow(controller).to receive(:current_user).and_return(user) 
    end 

    # rest of the code 
end 
+0

これは、すべての私のテストのために、ガイド:https://github.com/plataformatec/devise/wiki/How-To:-Stub-authentication-in-controller-specsおよびhttps://github.com/plataformatec/devise/wiki/How-To:- Test-controllers-Rails-3および4%28およびRSpec%29は、1つの例では動作しますが、スイート全体ではありません。 – Foton

関連する問題