2017-02-18 1 views
0

Ну, я новичок в кодировании с Rails и учебником Майкла Хартла, это потрясающе, и до сих пор я benn способен найти мои ошибки в кодировании ... прямо сейчас в главе 10 «Дружественная переадресация» и, выполняя тест на успешное редактирование, наткнулся на ошибку, которую я не вижу.Rails Tutorial Глава 10 (дружественная переадресация) ошибка теста, Ожидаемый ответ будет <3XX: redirect>, но был <200: OK>

test_successful_edit_with_friendly_forwarding # UserEditTest (1.07s) Ожидаемый ответ быть < 3XX: перенаправление>, но был < 200: OK> тест/интеграция/user_edit_test.rb: 32: в `блоке в '

мой user_edit_test является:

require 'test_helper' 

class UserEditTest < ActionDispatch::IntegrationTest 

    def setup 
    @user = users(:michael) 
    end 

    test "unsuccessful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
    assert_template 'users/edit' 
    patch user_path(@user), params: { user: { name: "", 
               email: "[email protected]", 
               password:    "foo", 
               password_confirmation: "bar" } } 

    assert_template 'users/edit' 
    end 

test "successful edit with friendly forwarding" do 
    get edit_user_path(@user) 
    log_in_as(@user) 
    assert_redirected_to edit_user_url(@user) 
    name = "Foo Bar" 
    email = "[email protected]" 
    patch user_path(@user), params: { user: { name: name, 
               email: email, 
               password:    "", 
               password_confirmation: "" } } 
    assert_not flash.empty? 
    assert_redirected_to @user <--- this is line 32 from the test 
    @user.reload 
    assert_equal name, @user.name 
    assert_equal email, @user.email 
    end 
end 

Мой пользователи контроллер:

class UsersController < ApplicationController 
    before_action :logged_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) # Not the final implementation! 
    if @user.save 
     log_in @user 
     flash[:success] = "Welcome to the Sample App" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 

    def edit 
     end 

    def update 
     if @user.update_attributes(user_params) 
      flash[:success] = "Profile updated" 
      redirect_to @user 
     # Handle a successful update. 
    else 
     render 'edit' 
    end 
    end 

    private 

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

#Before Filters 

#Confirms a logged-in user 
    def logged_in_user 
     unless logged_in? 
     store_location 
     flash[:danger] = "Please log in." 
     redirect_to login_url 
     end 
    end 

    # Confirms the correct user. 
    def correct_user 
     @user = User.find(params[:id]) 
     redirect_to(root_url) unless current_user?(@user) 
    end 
end 

Моего sessions.Helper является:

module SessionsHelper 

    #logs in the given user 
    def log_in(user) 
     session[:user_id] = user.id 
    end 

# Remembers a user in a persistent session. 
    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    def current_user 
      if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
end 

#returns true if the current user is the given user 
def current_user?(user) 
    user == current_user 
end 

# Returns true if the user is logged in, false otherwise. 
    def logged_in? 
     !current_user.nil? 
    end 

def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
end 

# Logs out current user 
    def log_out 
     forget(current_user) 
    session.delete(:user_id) 
     @current_user = nil 
    end 

# Redirects to stored location (or to the default). 
    def redirect_back_or(default) 
    redirect_to(session[:forwarding_url] || default) 
    session.delete(:forwarding_url) 
    end 

    # Stores the URL trying to be accessed. 
    def store_location 
    session[:forwarding_url] = request.original_url if request.get? 
    end 
end 

И мой Сессии Контроллер:

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    @user = User.find_by(email: params[:session][:email].downcase) 
    if @user && @user.authenticate(params[:session][:password]) 
     log_in @user 
     params[:session][:remember_me] == '1' ? remember(@user) : forget(@user) 
     redirect_back_or @user 
    else 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    log_out if logged_in? 
    redirect_to root_url 
    end 
end 

Из того, что я видел в других вопросах я понимаю проблему, но не могу показаться, чтобы найти способ исправить это, я чувствую, что это прямо на моем лице, но не вижу его.

ответ

0

FWIW, ваша дружественная пересылка работает правильно и протестирована в первых трех строках вашего тестового корпуса. Тест assert_redirected_to @user соответствует вашему обновлению UsersController #, а именно: redirect_to @user в ветке if. Что произойдет, если вы заходите на сайт и обновляете профиль пользователя? Проверьте журналы в этой точке тоже.

+0

Да, вчера я занимался запуском и понимал далее код теста и увидел, что FF работает нормально ... тогда я сделал прогон в приложении, чтобы увидеть, была ли ошибка, отображаемая в тесте, назад ... и нет, все прошло отлично, я смог отправить редактирование пользователя, а затем просмотреть изменения ... и перенаправление было тем, чего я ожидал ... sooo !!! все еще пытаясь понять это –

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