Je suive le Tutorial ROR et je suis bloqué à Liste 9.15
J'obtiens l'erreur suivante après avoir exécuté 'Bundle Exec Rspec Spec /' :
1) Authentication authorization as wrong user submitting a PATCH request to the Users#update action
Failure/Error: specify { expect(response).to redirect_to(root_url) }
ArgumentError:
Missing Host to link to! Please provide the :Host parameter, set default_url_options[:Host], or set :only_path to true
# ./spec/features/authentication_pages_spec.rb:79:in `block (5 levels) in <top (required)>'
Mon code de test d'authentification est:
exiger 'spéc_helper'
describe "Authentication", type: :request do
subject { page }
describe "signin page" do
before { visit signin_path }
it { should have_content('Sign in') }
it { should have_title('Sign in') }
end
describe "signin" do
before { visit signin_path }
describe "with invalid information" do
before { click_button "Sign in" }
it { should have_title('Sign in') }
it { should have_selector('div.alert.alert-error', text: 'Invalid') }
describe "after visiting another page" do
before { click_link "Home" }
it { should_not have_selector('div.alert.alert-error') }
end
end
describe "with valid information" do
let(:user) { FactoryGirl.create(:user) }
before { sign_in user }
#it { should have_title(user.name) }
it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Settings', href: edit_user_path(user)) }
it { should have_link('Sign out', href: signout_path) }
it { should_not have_link('Sign in', href: signin_path) }
describe "followed by signout" do
before { click_link "Sign out" }
it { should have_link('Sign in') }
end
end
end
describe "authorization" do
describe "for non-signed-in users" do
let(:user) { FactoryGirl.create(:user) }
describe "in the Users controller" do
describe "visiting the edit page" do
before { visit edit_user_path(user) }
it { should have_title('Sign in') }
end
describe "submitting to the update action" do
before { patch user_path(user) }
specify { expect(response).to redirect_to(signin_path) }
end
end
end
describe "as 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 { patch user_path(wrong_user) }
specify { expect(response).to redirect_to(root_url) }
end
end
end
end
Je ne sais pas comment résoudre ce problème pour que le test passe. Comment do je le résoudre? Quelqu'un pourrait-il expliquer ce qui ne va pas? (Selon le tutoriel, le test devrait passer).
En fin de compte, je viens d'utiliser:
root_path
à la place de:
root_url
Le problème peut être que vous n'avez pas défini de défaut_HOST pour l'environnement de test. Définir par défaut_host Inside Config/environnements/Test.Rb Comme ceci:
config.action_mailer.default_url_options = {:Host => "localhost:3000"}
Vous devez définir le défaut_url dans chaque environnement (développement, test, production).
Vous avez besoin de faire ces changements.
config/environments/development.rb
config.action_mailer.default_url_options =
{ :Host => 'your-Host-name' } #if it is local then 'localhost:3000'
config/environments/test.rb
config.action_mailer.default_url_options =
{ :Host => 'your-Host-name' } #if it is local then 'localhost:3000'
config/environments/development.rb
config.action_mailer.default_url_options =
{ :Host => 'your-Host-name' } #if it is local then 'localhost:3000'
Pour les tests tels que les tests de contrôleur affichés dans l'exemple de l'OP, un autre paramètre est nécessaire pour résoudre cette erreur. Mentionné par Kesha Antonov Vous pouvez plutôt utiliser les itinéraires par défaut_url_options. En ajoutant le paramètre suivant sur la dernière ligne de votre configuration/environnements/test.rb (après le ), vos tests utiliseront l'hôte donné à Construire des URL:
Rails.application.routes.default_url_options[:Host] = 'lvh.me:3000'
Comme mentionné par le PO dans une autre réponse, vous pouvez plutôt passer à un cheminitinéraire nommé Lorsque l'erreur provient d'une URL nommée itinéraire.
Si vous souhaitez définir l'hôte par défaut des aperçus d'expédition des expéditeurs, vous souhaitez que l'action_mailer.default_url_options mentionnée dans d'autres réponses.
config.action_mailer.default_url_options = { :Host => "localhost:3000" }
Voir génération d'URL dans le Action Mailer API Documents pour plus d'informations sur le paramètre Action_Mailer.