2013-08-04 2 views
6

Я пытаюсь написать тесты и код приложения, чтобы перенаправить пользователей, которые уже вошли в корневой путь, если они пытаются СОЗДАТЬ пользователя или посетить новый путь пользователя ,Rails Tutorial Ch. 9 Упражнение 6: Ожидаемый ответ будет <redirect>, но был <200>

Вот тесты, которые я написал в user_pages_spec.rb:

describe "for signed in users" do 
     let(:user) { FactoryGirl.create(:user) } 
     before { sign_in user } 

     describe "using a 'new' action" do 
     before { get new_user_path } 
     specify { response.should redirect_to(root_path) } 
     end 

     describe "using a 'create' action" do 
     before { post users_path } 
     specify { response.should redirect_to(root_path) } 
     end   
    end 

UsersController:

class UsersController < ApplicationController 
    before_action :unsigned_in_user, only: [:create, :new] 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     sign_in @user 
      flash[:success] = "Welcome to the Sample App!" 
      redirect_to @user 
    else 
      render 'new' 
    end 
    end 

    private 
    # Before filters 

    def user_params 
     params.require(:user).permit(:name, :email, :password, 
           :password_confirmation) 
    end 

    def unsigned_in_user 
     puts signed_in? 
     redirect_to root_url, notice: "You are already signed in." unless !signed_in? 
    end 
end 

В puts signed_in? возвращает ложь. Я предполагаю, что это проблема, потому что я ожидаю, что она вернется. Вот ошибки после запуска тестов с помощью rspec. Любая помощь приветствуется.

Failures: 

    1) User pages for signed in users using a 'create' action 
    Failure/Error: before { post users_path } 
    ActionController::ParameterMissing: 
     param not found: user 
    # ./app/controllers/users_controller.rb:52:in `user_params' 
    # ./app/controllers/users_controller.rb:20:in `create' 
    # ./spec/requests/user_pages_spec.rb:162:in `block (4 levels) in <top (required)>' 

    2) User pages for signed in users using a 'new' action 
    Failure/Error: specify { response.should redirect_to(root_path) } 
     Expected response to be a <redirect>, but was <200> 
    # ./spec/requests/user_pages_spec.rb:158:in `block (4 levels) in <top (required)>' 

В файле sessions_helper.rb:

def signed_in? 
    !current_user.nil? 
end 

В спецификации/поддержки/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 
+0

Опубликовать код для signed_in? метод. Поскольку он возвращает то, чего вы не ожидали, проблема, вероятно, лежит там. – amb110395

+0

добавлен. Я новичок в рельсах, но мне интересно, является ли тот факт, что signed_in? определяется в session_helper.rb, и я пытаюсь использовать его в контроллере пользователей (а не контроллере сеансов), создает проблему. – IkegawaTaro

+0

В случае, конечно, это вызовет проблему, если вы не включите SessionHelper в свой ApplicationController. Ты сделал это? – amb110395

ответ

4

смог получить тесты пройти Были ли вы?

В случае, если вы этого не сделали, у меня была такая же проблема, как и у вас сегодня, и мне удалось пройти тесты, сделав два изменения в тестах - передав хэш-код user при POSTing и используя опцию no_capybara на метод sign_in, поскольку get и post не являются методами capybara, и я думаю, что RSpec не ведет себя так, как мы могли бы ожидать, если мы переключимся с capybara на методы non-capybara в рамках одного и того же теста.

describe "for signed-in users" do 
    let(:user) { FactoryGirl.create(:user) } 
    before { sign_in user, no_capybara: true } 

    describe "using a 'new' action" do 
    before { get new_user_path }  
    specify { response.should redirect_to(root_path) } 
    end 

    describe "using a 'create' action" do 
    before do 
     @user_new = {name: "Example User", 
        email: "[email protected]", 
        password: "foobar", 
        password_confirmation: "foobar"} 
     post users_path, user: @user_new 
    end 

    specify { response.should redirect_to(root_path) } 
    end 
end 
+1

Ницца! Я добавил параметр no_capybara: true для первого теста, и теперь оба передаются. Я не передал пользовательский хэш для создания, но теперь он проходит. Наверное, это не требование ... т. Е.из теста microposts: описать «подчинение действию create» do до {post microposts_path} указать {expect (response) .to redirect_to (signin_path)} end – IkegawaTaro

+1

О, это имеет смысл, потому что пользовательский хэш будет только необходимо, если Rails фактически выполняет метод create, который мы пытаемся предотвратить. Спасибо, мы оба заполняем пробелы друг друга :) – najwa

3

Тот же ответ, как Najwa, но я использовал FactoryGirl пользователя с Rails атрибуты метод, чтобы избежать дублирования:

describe "using a 'create' action" do 
    before { post users_path, user: user.attributes } 

    specify { response.should redirect_to(root_path) } 
end 

помогает сохранить данные отсоединяется от тестового кода.

Смежные вопросы