test.host in Rspec testing Rails redirect

10,507

Solution 1

To set the app host and server port with Capybara add the following lines to your spec/spec_helper.rb file

Capybara.configure do |config|
  config.app_host   = 'http://127.0.0.1'
  config.server_port = 3000
end

-- Edit #1

A nice overview of testing domains is available at http://blog.joncairns.com/2012/12/testing-domains-with-rails-and-test-unit/

Solution 2

Here's the workaround that seems to have fixed the issue for me:

In spec/rails_helper.rb add this

module ActionDispatch
  class TestRequest
    # Override host, by default it is test.host
    def host
      'localhost:3000'
    end
  end
end

Solution 3

This worked for me:

# spec/controllers/whatever_controller_spec.rb
before :each do
  @request.host = '127.0.0.1:3000'
end

Based on the link @dan-reedy supplied. It is sublimely annoying to have to configure the exact same parameters in config/environments, spec/spec_helper.rb and again here... all in marginally different ways (with 'http://' or without, with port number or port specified separately). Even Capybara.configure syntax can't seem to stay consistent to itself between versions...

But give it a try and see if that solves it.

Share:
10,507
conradkleinespel
Author by

conradkleinespel

Updated on July 19, 2022

Comments

  • conradkleinespel
    conradkleinespel almost 2 years

    Here's a line from my test.rb environnment file in a Rails 3.1.12 app:

    config.action_mailer.default_url_options = config.action_controller.default_url_options = { :host => "127.0.0.1", :port => 3000 }
    

    Now here's the test I make:

    subject { get :success }
    subject.should redirect_to(:home)
    

    This produces an error:

    Failure/Error: subject.should redirect_to(:home)
           Expected response to be a redirect to <http://127.0.0.1:3000/> but was a redirect to <http://test.host/>
    

    What did I do wrong? Or else, where the testing host be configured?

    Here's the spec_helper.rb file for complete reference.

    # This file is copied to spec/ when you run 'rails generate rspec:install'
    ENV["RAILS_ENV"] = 'test'
    require File.expand_path("../../config/environment", __FILE__)
    require 'rspec/rails'
    require 'rspec/autorun'
    require 'capybara/rspec'
    
    # Requires supporting ruby files with custom matchers and macros, etc,
    # in spec/support/ and its subdirectories.
    Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
    
    RSpec.configure do |config|
      # ## Mock Framework
      #
      # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
      #
      # config.mock_with :mocha
      # config.mock_with :flexmock
      # config.mock_with :rr
    
      # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
      config.fixture_path = "#{::Rails.root}/spec/fixtures"
    
      # If you're not using ActiveRecord, or you'd prefer not to run each of your
      # examples within a transaction, remove the following line or assign false
      # instead of true.
      config.use_transactional_fixtures = true
    
      # If true, the base class of anonymous controllers will be inferred
      # automatically. This will be the default behavior in future versions of
      # rspec-rails.
      config.infer_base_class_for_anonymous_controllers = false
    
      # Run specs in random order to surface order dependencies. If you find an
      # order dependency and want to debug it, you can fix the order by providing
      # the seed, which is printed after each run.
      #     --seed 1234
      config.order = "random"
    end
    Capybara.configure do |config|
      config.app_host    = 'http://127.0.0.1'
      config.server_port = 3000
    end
    
    • Joshua Pinter
      Joshua Pinter over 3 years
      I'm still running into this on Rails 5.2 and rspec-rails 3.9. Ridiculous. Using _path instead of _url for now to get around it.
    • Tim Diggins
      Tim Diggins about 3 years
      Comprehensive answer: stackoverflow.com/a/29037481/109175
  • conradkleinespel
    conradkleinespel about 11 years
    This does not seem to work for me. I've updated the question with the spec helper content.
  • Dan Reedy
    Dan Reedy about 11 years
    Do you still receive the same error message when you add the Capybara config options?
  • conradkleinespel
    conradkleinespel about 11 years
    Yes. Same error. To get around this, I've used home_path instead for now. But this doesn't check the domain, which is a problem on the long term.