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
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
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
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