2010-03-31 30 views
51

Tôi đang sử dụng rSpec để thử nghiệm ứng dụng của mình. Trong bộ điều khiển ứng dụng của tôi, tôi có một phương pháp như vậy:Rails rspec đặt tên miền phụ

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

Có thể đặt request.subdomain trong thông số của tôi không? Có lẽ trong khối trước? Tôi mới đến rSpec vì vậy bất kỳ lời khuyên nào về điều này sẽ là lời cảm ơn tuyệt vời.

Eef

Trả lời

83

Tôi đã tìm ra cách sắp xếp sự cố này.

Trong khối trước của tôi trong thông số kỹ thuật của tôi, tôi chỉ đơn giản là thêm vào:

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

này thiết lập lên request.subdomains.first được giá trị của mock_subdomain.

Hy vọng ai đó thấy điều này hữu ích vì nó không được giải thích rất rõ ở bất cứ đâu trên mạng.

+9

một mẹo nhỏ - yêu cầu là availab le như một phương thức cũng như một biến mẫu. Nó có thể tốt hơn để truy cập nó thông qua phương pháp, để giữ một khoảng cách nhỏ giữa bạn và mã RSpec cơ bản. – pat

+0

Tôi có thể hỏi làm thế nào nó được thực hiện theo cách phương pháp? – lulalala

+5

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

8

Trong đường ray 3 mọi thứ tôi đã cố gắng đặt thủ công máy chủ không hoạt động, nhưng tìm mã tôi nhận thấy cách chúng phân tích cú pháp đường dẫn bạn chuyển đến yêu cầu trợ giúp như get. Chắc chắn nếu điều khiển của bạn đi và lấy người dùng được đề cập trong tên miền phụ và lưu trữ nó như @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

Có hay không đây là cách chính thức để thực hiện điều đó trong Rails 3, thêm máy chủ trực tiếp vào đường dẫn như được minh chứng bởi ilpoldo đã làm việc cho tôi. –

+0

Điều này không hoạt động trong thông số bộ điều khiển. Bạn không thể làm đường dẫn "get" "'. Nó sẽ giải thích rằng đó là hành động. Bạn phải làm 'get: action_name' chỉ vì một lý do nào đó. – darksky

+1

Vâng, phần trên là một đoạn trích từ thông số yêu cầu. – ilpoldo

29

Tôi biết đây là một câu hỏi tương đối cũ, nhưng tôi đã phát hiện ra rằng điều này phụ thuộc vào loại bài kiểm tra bạn đang chạy. Tôi cũng đang chạy Rails 4 và RSpec 3.2, vì vậy tôi chắc chắn một số điều đã thay đổi kể từ khi câu hỏi này được hỏi.

Yêu cầu Specs

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

Specs Feature với Capybara

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

Tôi thường tạo module trong spec/support rằng giống như thế này:

# 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 

Include in spec/rails_helper.rb:

RSpec.configure do |config| 
    # ... 

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

Sau đó, bạn có thể gọi trong spec của bạn như sau:

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

Bạn, Sir, cảm ơn bạn! –

0
  • RSpec - 3.6.0
  • Capybara - 2.15.1

Chris Peters' câu trả lời làm việc cho tôi cho Yêu cầu thông số kỹ thuật, nhưng đối với thông số kỹ thuật Tính năng, tôi đã phải thực hiện những thay đổi sau:

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 
Các vấn đề liên quan