您好朋友我有事要先承認,我以前的帳戶被禁止提問,從現在開始,我會盡量讓問題更清晰準確!使用Rspec進行測試會出錯,但使用瀏覽器進行測試可以正常工作
我正在研究Hartl的Ruby on Rails教程,我被困在chapter 9.2.2 Requiring the right user
``「列表9.13測試編輯和更新操作需要合適的用戶」幾天。我做了大量的研究,我回過頭來看章節,沒有起作用,似乎沒有人有我現在的問題。讓我詳細解釋一下。
錯誤:
Authentication authorization as wrong user submitting a GET request to the Users#edit action
Failure/Error: specify { expect(response.body).not_to match(full_title('Edit user')) }
TypeError:
wrong argument type nil (expected Regexp)
# ./spec/requests/authentication_pages_spec.rb:61:in `block (5 levels) in <top (required)>'
Finished in 1.77 seconds
64 examples, 1 failure
我與布勞爾測試,它完美的作品,我試圖編輯其他用戶。該頁面已成功導向主頁!
Github上:https://github.com/Snailseason2014/Sample
這裏有一些相關的文件:
規格/請求/ authentication_pages_spec.rb
require 'spec_helper'
describe 'Authentication' do
subject { page }
describe 'signin page' do
before { visit signin_path }
it { should have_content('Sign in') }
it { should have_title('Sign in') }
end
describe 'signin' do
before { visit signin_path }
describe 'with invalid information' do
before { click_button 'Sign in' }
it { should have_title('Sign in') }
it { should have_selector('div.alert.alert-error', text: 'Invalid') }
describe 'after visiting another page' do
before { click_link 'Home' }
it { should_not have_selector('div.alert.alter-error') }
end
end
describe 'with valid information' do
let(:user) { FactoryGirl.create(:user) }
before { sign_in user }
it { should have_title(user.name) }
it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Settings', href: edit_user_path(user)) }
it { should have_link('Sign out', href: signout_path) }
it { should_not have_link('Sign in', href: signin_path) }
describe 'followed by signout' do
before { click_link 'Sign out' }
it { should have_link('Sign in') }
end
end
end
describe 'authorization' do
describe 'for non-signed-in users' do
let(:user) { FactoryGirl.create(:user) }
describe 'in the Users controller' do
describe 'visiting the edit page' do
before { visit edit_user_path(user) }
it { should have_title('Sign in') }
end
describe 'submitting to the update action' do
before { patch user_path(user) }
specify { expect(response).to redirect_to(signin_path) }
end
end
end
describe 'as wrong user' do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: '[email protected]') }
before { sign_in user, no_capybara: true }
describe 'submitting a GET request to the Users#edit action' do
before { get edit_user_path(wrong_user) }
specify { expect(response.body).not_to match(full_title('Edit user')) }
specify { expect(response).to redirect_to(root_url) }
end
describe 'submitting a PATCH request to the Users#update action' do
before { patch user_path(wrong_user) }
specify { expect(response).to redirect_to(root_url) }
end
end
end
end
應用程序/控制器/ users_controller.rb
class UsersController < ApplicationController
before_action :signed_in_user, only: [:edit, :update]
before_action :correct_user, only: [:edit, :update]
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
sign_in @user
flash[:success] = 'welcome motherfuckers'
redirect_to @user
else
render 'new'
end
end
def edit
# @user = User.find(params[:id])
end
def update
# @user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = 'Profile updated'
redirect_to @user
else
render 'edit'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
# Before filters
def signed_in_user
redirect_to signin_url, notice: 'Please sign in.' unless signed_in?
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)
end
end
你有什麼版本的Hartl教程?在我的副本上甚至在他的網頁上都沒有第9.13章(https://www.railstutorial.org/book/updating_and_deleting_users) – pawel7318 2014-09-21 14:48:26
Hi Pawel,我有Hartl教程的這個版本。非常感謝你回覆我,我看到了希望!其在9.2.2要求合適的用戶要求登錄用戶https://www.railstutorial.org/book/updating_and_deleting_users – Snailwalker 2014-09-21 14:50:42
它在9.2.2章節列表9.13,我剛剛修改了這個問題,謝謝 – Snailwalker 2014-09-21 14:54:33