2014-02-07 81 views
1

我正在使用Rails和Devise構建API。我的會話控制器從下面爲api設計sign_in導致RSpec測試失敗

api/base_controller.rb 

module Api 
    class BaseController < ApplicationController 
    skip_before_filter :verify_authenticity_token 
    before_filter :authenticate_user_from_token! 
    respond_to :json 

    private 

    def authenticate_user_from_token! 
     user_token = params[:auth_token].presence 
     user  = user_token && User.find_by_authentication_token(user_token) 

     if user 
      sign_in user, store: false 
     else 
      render :json => {:success => false, :message => "Error with your credentials",  :status => 401} 
     end 
    end 
    end 
end 

我的會話控制器的破壞行動以下基本控制器繼承:

api/sessions_controller.rb 

before_filter :authenticate_user_from_token!, :except => [:create] 


def destroy 
    current_user.reset_authentication_token 
    render :json => { 
    :success => true, 
    :status => 200 
    } 
end 

通過捲曲測試API時,這完美的作品。但是,我無法讓我的Rspec測試通過銷燬行爲。來自Rspec的sign_in用戶調用失敗,所以響應是重定向。我沒有嘗試存根sign_in方法的任何成功。

Rspec的測試:

describe "DELETE destroy" do 
    before(:each) do 
    @user1 = User.create!(:email => '[email protected]', :password => 'helloworld', :password_confirmation => 'helloworld') 
    end 

    it "should render success json" do 
    delete :destroy, :auth_token => @user1.authentication_token 
    json = JSON.parse(response.body) 
    json.should include('success' => true, 'status' => 200) 
    end 

    ###this fails because the response is a redirect to the sign_in page 
end 

我應該如何去嘲諷從基本控制器內稱爲sign_in方法?

回答

1

添加spec/support/devise.rb文件與此內容:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

另外,請檢查您的test.log中羯羊它的實際使用JSON格式。我有類似的問題,並發現我不得不在我的規格調用參數中強制format :json

+0

我已經包含在我的spec_helper.rb文件中。我可以在Rspec測試中使用sign_in(@user),但基本控制器內的sign_in調用仍然導致重定向到sign_in路徑。 – user1280971

+0

你可以檢查你的test.log是否它實際上使用json格式?我有一個類似的問題,並發現我不得不在我的規格調用中強制使用'format:json'。 – andreamazz

+1

謝謝你指點我的測試日誌!它正在請求HTML,但這似乎不成問題。 我意識到我使用的是設計可確認的,並且正在創建一個未經確認的用戶,導致登錄時重定向。我設置了@ user1.skip_confirmation!並通過了所有測試! – user1280971

1

Andreamazz指出我的test.logs顯示我創建的用戶已被確認(我正在使用Devise confirmmable)。我使用user.confirm!在之前(:每個),一切都在傳遞。

describe "DELETE destroy" do 
    before(:each) do 
    @user1 = User.create!(:email => '[email protected]', :password => 'helloworld', :password_confirmation => 'helloworld') 
    @user1.confirm! 
    end 

    it "should render success json" do 
    delete :destroy, :auth_token => @user1.authentication_token 
    json = JSON.parse(response.body) 
    json.should include('success' => true, 'status' => 200) 
    end 
end 

謝謝!