2014-02-14 2 views
0

Я на самом деле застрял на главе 9 в Michael Hartl Rails Tutorial: http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-unsuccessful_editsMichael Hartl Rails Tutorial - неопределенная метод '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_in фактически определяется в app/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 репо Hartl является:

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