2015-07-04 11 views
0

Я обновляю сайт Rails с 4.0 до 4.1.12, и теперь довольно много моих тестов контроллера Rspec. Например, этот тест порвал с обновлением:Update Test On Controller Breaks in Rails 4.1.12

it "update action should render edit template" do 
    @user = create(:user) 
    @user.name = "" # model requires name 
    @controller.stubs(:current_user).returns(@user) 
    put :update, id: @user 
    expect(response).to render_template(:edit) 
end 

Я не получаю «нет соответствующего маршрута {: действие =>» шоу»,: контроллер =>„счета“,: идентификатор => ноль} Отсутствуют необходимые ключи : [:Я бы]". Похоже, что метод update_attributes игнорирует мои проверки модели внезапно. Код

Контроллер:

def update 
    @user = current_user 
    if @user.update_attributes(params[:user]) 
    redirect_to user_path(@user), :notice => "Your profile has been updated." 
    else 
    render :action => 'edit' 
    end 
end 

routes.rb

resources :users do 
    member do 
    get 'accounting' 
    end 

    collection do 
    post 'send_password' 
    end 
end 

Я уверен, что я пропустил что-то в процессе обновления, но я не вижу ничего в документации, что говорит мне что это такое.

+0

Мы упускаем ваш 'routes.rb' –

+0

Глядя на ошибку, что на самом деле маршрутизации на«шоу»не«обновление», как и Fire-Dragon-DoL говорит что нужно, чтобы увидеть ваши маршруты. Но моя первая мысль заключалась в том, что вы использовали «put» для обновления, а не для Rails 4 «patch». – Luke

+0

Все еще можно сделать с большим количеством кода. Подойдя ближе к ошибке, она фактически маршрутизируется на учетные записи # show, и я предполагаю, что с маршрутов, которые вы указали, вы тестируете пользовательский контроллер. Итак, есть ли перенаправление (например, before_action), когда-то происходящее с контроллером пользователей? – Luke

ответ

1

Чтобы просто отказаться от того, что я буду делать - вместо того, чтобы изменять объект @user в тесте, вам нужно отправить изменения, которые вы хотите внести, в объект пользователя в качестве параметров запроса. Таким образом, контроллер получит его в hash параметра [], иначе вы не будете проверять, что делает метод контроллера.

it "with invalid data; update action should render edit template" do 
    @user = create(:user) 
    @controller.stubs(:current_user).returns(@user) 
    patch :update, id: @user, user: { name: '' } 
    expect(response).to render_template(:edit) 
end 
+0

Да, я думаю, это был правильный путь. Я делал слишком много манипуляций с состоянием раньше в контроллере. Конечный контроллер выглядит так: def update @user = User.find (params [: id]) if @ user.update_attributes (user_params) redirect_to user_path (@user),: notice => «Ваш профиль обновлен». else render 'редактировать' end end –