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/support
die 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