我正在通過Michael Hartl的Rails教程。我下載了源代碼samle_app_rails_4。 然後我添加一個測試用於註銷用戶,它在我的瀏覽器中正常工作,但是在Rspec中,它失敗。我沒有改變任何源代碼,但將其添加到user_pages_spec.rb
。Rails教程爲用戶註銷添加測試但失敗
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。
希望有人能幫助我,非常感謝!
這對我有效。但是我也發現它在authentication_pages_spec.rb中使用'put user_path(user)}',這是通過curl之類的東西訪問的,對嗎?所以如果我想正常註銷用戶,我應該使用點擊註銷鏈接,得到它。十分感謝! – whyisyoung
我沒有發現任何'put'的用法,但是我確實使用了'post'和'patch'。看起來Michael在這個請求規範中包含了控制器示例。我不確定這是爲什麼。也許他希望保持身份驗證和授權範例彼此接近。至於使用'curl',我不確定你的意思。在我看到的例子中,他只是檢查'response'的值。 –
對不起,'put'是Rails 3.2,我的意思是'patch user_path(user)'。是的,他想檢查未登錄的用戶無法更新用戶,謝謝你的回答。 – whyisyoung