2013-07-23 3 views
1

Voici quelques extraits de code - si vous avez besoin de plus, faites le moi savoir et je l'afficherai.Tutoriel Rails - impossible d'obtenir un patch test pour travailler - patch méthode non reconnue

class UsersController < ApplicationController 

    before_filter :signed_in_user, only: [:edit, :update] 
    before_filter :correct_user, only: [:edit, :update] 

    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     sign_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(params[:user]) # user_params 
     flash[:success] = "Profile updated" 
     sign_in @user 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

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

    # Before filters 

    def signed_in_user 
     redirect_to signin_url, notice: "Please sign in." unless signed_in? 
    end 

    def correct_user 
     @user = User.find(params[:id]) 
     redirect_to(root_path) unless current_user?(@user) 
    end 
end 

puis le test unitaire ...

describe "authorization" do 
... 
       describe "submitting a PATCH request to the Users#update action" do 
        before { patch user_path(wrong_user) } 
        specify { expect(response).to redirect_to(root_path) } 
       end 

Si je lance cela, je reçois le message:

FailureError: before { patch user_path(wrong_user) } NoMethodError: undefined method `patch' for # RSpec::Core::ExampleGroup::Nested_3::Nested_1::Nested_3::Nested_2::Nested_2:0x...

Si je change patch pour poster, je reçois cela. ..

FailureError: before { post user_path(wrong_user) } ActionController::RoutingError: No route matches [POST] "users/1497"


L'erreur de put indique en fait que le test est redirigé vers le chemin de connexion, mais lorsque je le teste dans le navigateur, il est redirigé vers le chemin racine comme prévu. Je me demande si ma session ne persiste pas dans le test. Je me souviens encore de me donner une sorte d'ennuis comme ça avant dans les essais précédents ...

Voici le reste du code de test:

describe "for wrong user" do 
     let(:user) { FactoryGirl.create(:user) } 
     let(:wrong_user) { FactoryGirl.create(:user, email: "[email protected]") } 
     before { sign_in user, no_capybara: true } 

     describe "visiting Users#edit page" do 
      before { visit edit_user_path(wrong_user) } 
      it { should_not have_title(full_title('Edit user')) } 
     end 

     describe "submitting a PATCH request to the Users#update action" do 
      before { put user_path(wrong_user) } 
      specify { expect(response).to redirect_to(root_path) } 
     end 
    end # end for wrong user 

Répondre

3

patch existe dans Rails 4, est que vous utilisez Rails 3.2 (C'est ce qui est mentionné dans les tags de votre question) vous devez utiliser put à la place

+0

Il semblerait que mon problème est que d'une certaine manière, mon utilisateur n'est pas connecté. Quand je tester dans le navigateur, tout fonctionne bien, mais quand je cours le test unitaire, mis en fait me redirige vers la page de connexion. Cependant, j'ai un test précédent qui s'appuie sur cette méthode sign_in qui fonctionne ... – josiah

+0

Ah ok, je pensais que vous utilisiez des rails 3.2, la prochaine fois s'il vous plaît étiqueter votre question correctement :) Heureux que vous avez trouvé la solution de toute façon. Bravo – Benj

+0

Eh bien, vous étiez correct - mis travaillé, ce qui a révélé l'erreur REAL, haha, qui est que lors de la soumission d'une demande de mise à jour pour le mauvais utilisateur, je devais redirigé vers la mauvaise page. – josiah