2010-03-31 11 views
51

Ich verwende rSpec zum Testen meiner Anwendung. In meiner Anwendung Controller habe ich eine Methode, wie so:Rails rspec Subdomain

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

Ist es möglich, die request.subdomain in meiner spec zu setzen? Vielleicht im Vorblock? Ich bin neu in RSpec, so dass jeder Ratschlag wäre toll, danke.

Eef

Antwort

83

ich herausgefunden, wie dieses Problem zu sortieren.

In meinem vor Block in meinem specs ich einfach hinzugefügt:

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

Das die request.subdomains.first der Wert des mock_subdomain sein Setups auf.

Hoffe jemand findet das nützlich, wie es sonst nirgends im Netz sehr gut erklärt wird.

+9

ein kleiner Tipp - Anfrage ist verfügbar le als Methode und Instanzvariable. Es ist wahrscheinlich besser, über die Methode darauf zuzugreifen, um einen kleinen Abstand zwischen Ihnen und dem zugrunde liegenden RSpec-Code zu halten. – pat

+0

Darf ich fragen, wie es mit der Methode gemacht wird? – lulalala

+5

@lulalala 'request.host =" # {mock_subdomäne} .example.com "' – alf

8

In Schienen 3 alles, was ich versucht, den Host manuell einzustellen, hat nicht funktioniert, aber den Code sah ich, wie schön sie den Pfad geparst, übergeben Sie die Anfrage Helfer wie get. Sicher genug, wenn Ihre Steuerung geht und holt den Benutzer in der Sub-Domäne genannt und speichert sie 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 
+0

Unabhängig davon, ob dies die offizielle Methode in Rails 3 ist, funktioniert das Hinzufügen des Hosts direkt zum Pfad, wie von ilpoldo gezeigt, für mich. –

+0

Dies funktioniert nicht in Controller-Spezifikationen. Sie können Pfad nicht "holen". Es wird dies als die Aktion interpretieren. Sie müssen 'get: action_name' nur aus irgendeinem Grund tun. – darksky

+1

Ja, das obige ist ein Ausschnitt aus einer Anfrage-Spezifikation. – ilpoldo

29

weiß ich, das eine relativ alte Frage, aber ich habe festgestellt, dass diese auf welche Art von Test ab, die Sie renne. Ich fahre auch Rails 4 und RSpec 3.2, also bin ich mir sicher, dass sich einige Dinge geändert haben, seit diese Frage gestellt wurde.

anfordern Specs

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

Feature-Specs mit Capybara

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

ich in der Regel Module in spec/support erstellen, die wie folgt aussehen:

# 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 

In spec/rails_helper.rb:

RSpec.configure do |config| 
    # ... 

    # Extensions 
    config.extend FeatureSubdomainHelpers, type: :feature 
    config.extend RequestSubdomainHelpers, type: :request 
end 

Dann können Sie wie so in Ihrem spec nennen:

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 
+0

Sie, Sir, danke! –

0
  • Rspec - 3.6.0
  • Capybara - 2.15.1

Chris Peters Antwort für mich gearbeitet für Request-Spezifikationen, aber für Feature-Spezifikationen, hatte ich folgende Änderungen vornehmen:

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