2014-02-14 39 views
0

實際上,我被困在第9章的邁克爾·哈特爾Rails的教程: http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-unsuccessful_edits邁克爾·哈特爾Rails的教程 - 未定義的方法「sign_in」

當我運行命令行:

$ bundle exec rspec spec/requests/user_pages_spec.rb -e "edit page" 

我有錯誤:

Failure/Error: sign_in user 
NoMethodError: undefined method 'sign_in' for #<RSpec::Core::ExampleGroupe::Nested_1::Nested_4::Nested_1:0x4e7a0b8> 

問題來自這個代碼spec/requests/user_pages_spec.rb

describe "edit" do 
    let(:user) { FactoryGirl.create(:user) } 
    before do 
    sign_in user 
    visit edit_user_path(user) 
    end 
end 

sign_inapp/helpers/sessions_helper.rb實際上定義:

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 

而且SessionsHelper被包括在app/controllers/application_controller.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    include SessionsHelper 
end 

你有一個解決方案?

回答

1

您的user_pages_spec.rb是一個測試規範。它需要測試幫助程序中的sign_in方法,而不是我確定的應用程序的幫助程序。我之前做過這個教程,但剛剛回顧。我認爲你需要添加一些spec/support/utilities.rb,它爲你的規格提供了一個sign_in方法。

在哈特爾的GitHub庫最終的答案是:

include ApplicationHelper 

def sign_in(user) 
    visit signin_path 
    fill_in "Email", with: user.email 
    fill_in "Password", with: user.password 
    click_button "Sign in" 
    # Sign in when not using Capybara as well. 
    cookies[:remember_token] = user.remember_token 
end 

這應該是你的規格/支持/ utilities.rb決賽。

在教程本身,他在第9.6節中提到了這一點。

代碼9.6。測試幫手簽署用戶。

spec/support/utilities.rb 
. 
. 
. 
def sign_in(user, options={}) 
    if options[:no_capybara] 
    # Sign in when not using Capybara. 
    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 

這顯然從最終的不同,但是,我想這就是你需要開始。

+1

問題來自'include ApplicationHelper',它不在我的'utilities.rb'文件中。我剛剛添加了這一行,現在它是工作。 感謝您的幫助! – benjaminzanatta

+0

很高興我能給你一個權利:)。 – Art

相關問題