2010-03-31 15 views
51

Uygulamamı test etmek için rSpec kullanıyorum. Benim spec request.subdomain ayarlamak içinRaylar rspec set subdomain

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

mümkün mü: başvurum denetleyicisi ben şöyle bir yöntem var mı? Belki de önceki blokta? RSpec’e yeni geldim, bu konuda herhangi bir tavsiye çok teşekkür ederim.

Eef

cevap

83

Bu sorunu çözmek için nasıl düşündüm. Benim daha önce bloğunda

benim gözlük ben sadece ekledi:

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

Bu mock_subdomain değeri olmaya request.subdomains.first ayarlanabilecek.

Birisi, bunu net olarak başka hiçbir yerde açıklanmadığı için yararlı buluyor.

+9

küçük bir ipucu - istek is mevcut Bir örnek değişken gibi bir yöntem olarak le. Sizin ve altta yatan RSpec kodu arasında biraz mesafe tutmak için yönteme bağlı olarak erişmek daha iyi olacaktır. – pat

+0

Metodun nasıl yapıldığını sorabilir miyim? – lulalala

+5

@lulalala 'request.host =" # {mock_subdomain} .example.com "' – alf

8

Raylarda 3, ana makineyi el ile ayarlamak için elimden geleni yaptım, ancak kodu incelediğimde, yolun nasıl çözümlendiğini fark ettim. Tabii yeterince kontrolör alt alan ve mağazalarda belirtilen kullanıcıyı gider ve getirir eğer

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

Rails 3'te bunu yapmanın resmi yolu olsun ya da olmasın, evsahibini ilpoldo'nun gösterdiği gibi doğrudan yoluna eklemişim. –

+0

Bu, denetleyici teknik özelliklerinde çalışmaz. "Yol" almazsın. Bunu eylem olarak yorumlayacak. Sadece bir sebepten dolayı 'action_name' yapmalısınız. – darksky

+1

Evet, yukarıdaki istekte bulunan bir istek spek. – ilpoldo

29

@king_of_the_castle olarak bu nispeten eski bir soru olduğunu biliyorum, ama bu testin ne tür bağlıdır fark ettik sen Koşuyorsun. Ayrıca Rails 4 ve RSpec 3.2'yi çalıştırıyorum, bu yüzden bu soru sorulduğunda bazı şeylerin değiştiğinden eminim. Bu şuna benzer Capybara

before { Capybara.default_host = "http://#{mock_subdomain}.example.com" } 
after { Capybara.default_host = "http://www.example.com" } 
Ben genellikle spec/support modülleri oluşturmak

ile

talep Özellikleri

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

Özelliği Özellikleri:

# 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 

spec/rails_helper.rb dahil et:

RSpec.configure do |config| 
    # ... 

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

Sonra öylesine gibi spec içinde çağırabilirsiniz:

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

Siz, efendim, teşekkürler! –

0
  • RSpec - 3.6.0
  • Capybara - 2.15.1

Chris Peters' cevabı İsteği özellikleri benim için çalışıyor, ama Özelliği özellikleri için ben aşağıdaki değişiklikleri yapmak zorunda kaldı:

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