Rails rspec set subdomein

Ik gebruik rSpec om mijn applicatie te testen. In mijn applicatiecontroller heb ik een methode als volgt:

def set_current_account
  @current_account ||= Account.find_by_subdomain(request.subdomains.first)
end

Is het mogelijk om het request.subdomein in mijn specificatie in te stellen? Misschien in het voor-blok? Ik ben nieuw bij rSpec, dus elk advies hierover zou geweldig zijn, bedankt.

Eef


Antwoord 1, autoriteit 100%

Ik heb ontdekt hoe ik dit probleem kan oplossen.

In mijn voor-blok in mijn specificaties heb ik eenvoudig toegevoegd:

before(:each) do
  @request.host = "#{mock_subdomain}.example.com"
end

Hiermee wordt request.subdomains.first ingesteld als de waarde van het mock_subdomain.

Ik hoop dat iemand dit nuttig vindt, want het wordt nergens anders op het net zo goed uitgelegd.


Antwoord 2, autoriteit 62%

Ik weet dat dit een relatief oude vraag is, maar ik heb ontdekt dat dit afhangt van het soort test dat je uitvoert. Ik gebruik ook Rails 4 en RSpec 3.2, dus ik weet zeker dat er een aantal dingen zijn veranderd sinds deze vraag werd gesteld.

Specificaties aanvragen

before { host! "#{mock_subdomain}.example.com" }

Functiespecificaties met Capybara

before { Capybara.default_host = "http://#{mock_subdomain}.example.com" }
after  { Capybara.default_host = "http://www.example.com" }

Ik maak meestal modules in spec/supportdie er ongeveer zo uitzien:

# spec/support/feature_subdomain_helpers.rb
module FeatureSubdomainHelpers
  # Sets Capybara to use a given subdomain.
  def within_subdomain(subdomain)
    before { Capybara.default_host = "http://#{subdomain}.example.com" }
    after  { Capybara.default_host = "http://www.example.com" }
    yield
  end
end
# spec/support/request_subdomain_helpers.rb
module RequestSubdomainHelpers
  # Sets host to use a given subdomain.
  def within_subdomain(subdomain)
    before { host! "#{subdomain}.example.com" }
    after  { host! "www.example.com" }
    yield
  end
end

Opnemen in spec/rails_helper.rb:

RSpec.configure do |config|
  # ...
  # Extensions
  config.extend FeatureSubdomainHelpers, type: :feature
  config.extend RequestSubdomainHelpers, type: :request
end

Dan kunt u binnen uw specificaties als volgt bellen:

feature 'Admin signs in' do
  given!(:admin) { FactoryGirl.create(:user, :admin) }
  within_subdomain :admin do
    scenario 'with valid credentials' do
      # ...
    end
    scenario 'with invalid password' do
      # ...
    end
  end
end

Antwoord 3, autoriteit 9%

In rails 3 werkte alles wat ik probeerde om de host handmatig in te stellen niet, maar toen ik de code zag, merkte ik hoe goed ze het pad ontleden dat je doorgeeft aan de verzoekhelpers zoals get.
Zeker genoeg als je controller de gebruiker ophaalt die in het subdomein wordt genoemd en deze opslaat als @king_of_the_castle

it "fetches the user of the subomain" do
  get "http://#{mock_subdomain}.example.com/rest_of_the_path"
  assigns[:king_of_the_castle].should eql(User.find_by_name mock_subdomain)
end

Antwoord 4, autoriteit 2%

  • Rspec – 3.6.0
  • Capibara – 2.15.1

Het antwoord van Chris Peters werkte voor mij voor de specificaties van het verzoek, maar voor de functiespecificaties moest ik de volgende wijzigingen aanbrengen:

rails_helper:

Capybara.app_host = 'http://lvh.me'
Capybara.always_include_port = true

feature_subdomain_helpers:

module FeatureSubdomainHelpers
    def within_subdomain(subdomain)
        before { Capybara.app_host = "http://#{subdomain}.lvh.me" }
        after  { Capybara.app_host = "http://lvh.me" }
        yield
    end
end

Other episodes