web-dev-qa-db-fra.com

Comment résoudre "l'hôte manquant pour lien vers! Veuillez fournir le paramètre d'hôte"? (Ror)

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

17
Sheldon

En fin de compte, je viens d'utiliser:

root_path

à la place de:

root_url
20
Sheldon

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"}
62
Aman Garg

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'
4
Prabhakar Undurthi

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.

2
DBrown