2013-08-23 36 views
1

我正在通過Michael Hartl的Rails教程。我下載了源代碼samle_app_rails_4。 然後我添加一個測試用於註銷用戶,它在我的瀏覽器中正常工作,但是在Rspec中,它失敗。我沒有改變任何源代碼,但將其添加到user_pages_spec.rbRails教程爲用戶註銷添加測試但失敗

require 'spec_helper' 
describe "User pages" do 

    describe "sign out" do 
    let(:user) { FactoryGirl.create(:user) } 
    before :each do 
     sign_in user 
    end 

    it "should sign out a user" do 
     delete signout_path 
     expect(page).to have_content("Sign in") 
    end 
    end 
end 

sign_in方法在spec/support/utilities.rb

include ApplicationHelper 

def sign_in(user, options={}) 
    if options[:no_capybara] 
    # Sign in when not using Capybara as well. 
    remember_token = User.new_remember_token 
    cookies[:remember_token] = remember_token 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    else 
    visit signin_path 
    fill_in "Email", with: user.email 
    fill_in "Password", with: user.password 
    click_button "Sign in" 
    end 
end 

定義的sessions_controller.rb是這樣的(我忽略了這裏創建行動。)

class SessionsController < ApplicationController 
    def new 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

而且sessions_helper.rb是這樣的:

module SessionsHelper 

    def sign_in(user) 
    remember_token = User.new_remember_token 
    cookies.permanent[:remember_token] = remember_token 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    self.current_user = user 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
    end 

    def current_user?(user) 
    user == current_user 
    end 

    def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    end 
end 

我已經嘗試了多種解決方案,張貼的問題在github上,這Cookies do not persist in Rspec on rails 3.1

我也經歷這些問題,但沒有什麼是有幫助的。 https://stackoverflow.com/questions/tagged/railstutorial.org

我甚至升級了我的rspec和水豚寶石。也許我的測試文件有問題? delete signout_path不適合註銷用戶嗎? 我發現它在示例應用程序中很奇怪,因爲用戶已經登錄,他仍然可以訪問signin_path和signup_path。

希望有人能幫助我,非常感謝!

回答

1

您在示例中訪問的page變量僅適用於使用水豚方法,如visitclick。通過直接發出HTTP delete操作,您繞過了水豚以及page變量的設置。

您可以使用例如訪問響應正文response.body,但要注意,教程演示使用不同的要求規範和水豚的click方法在http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-signout_test簽出的考驗。

+0

這對我有效。但是我也發現它在authentication_pages_spec.rb中使用'put user_path(user)}',這是通過curl之類的東西訪問的,對嗎?所以如果我想正常註銷用戶,我應該使用點擊註銷鏈接,得到它。十分感謝! – whyisyoung

+0

我沒有發現任何'put'的用法,但是我確實使用了'post'和'patch'。看起來Michael在這個請求規範中包含了控制器示例。我不確定這是爲什麼。也許他希望保持身份驗證和授權範例彼此接近。至於使用'curl',我不確定你的意思。在我看到的例子中,他只是檢查'response'的值。 –

+0

對不起,'put'是Rails 3.2,我的意思是'patch user_path(user)'。是的,他想檢查未登錄的用戶無法更新用戶,謝謝你的回答。 – whyisyoung

0

當我閱讀代碼,SessionsController#destroy重定向到static_pages#home不包含字符串「登錄」

+1

登錄鏈接位於標題中,位於'app/views/layouts/_header.html.erb' –

+0

D'oh!你是對的。 – Fred

0
在規範

您重定向signout用戶後root_url,所以你應該有串「登錄」在root_url中,只需將例如<h1>Sign in</h1>添加到您的root_url視圖中,並且它將被傳遞,如果您的根網址不包含要登錄的表單,在這種情況下,您應該重定向到signin_path(將包含字符串「Sign in「)

+0

正如Peter所說,登錄鏈接位於標頭中:'app/views/layouts/_header.html.erb'。 – whyisyoung

相關問題