我正在使用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方法?
我已經包含在我的spec_helper.rb文件中。我可以在Rspec測試中使用sign_in(@user),但基本控制器內的sign_in調用仍然導致重定向到sign_in路徑。 – user1280971
你可以檢查你的test.log是否它實際上使用json格式?我有一個類似的問題,並發現我不得不在我的規格調用中強制使用'format:json'。 – andreamazz
謝謝你指點我的測試日誌!它正在請求HTML,但這似乎不成問題。 我意識到我使用的是設計可確認的,並且正在創建一個未經確認的用戶,導致登錄時重定向。我設置了@ user1.skip_confirmation!並通過了所有測試! – user1280971