2009-03-01 27 views
39

Tôi có một ứng dụng đường ray hoạt động khác nhau tùy thuộc vào tên miền được truy cập tại (ví dụ: www.myapp.com sẽ gọi khác với user.myapp.com). Trong quá trình sử dụng sản xuất, tất cả đều hoạt động tốt nhưng mã thử nghiệm của tôi luôn thấy tên máy chủ là "www.example.com".Làm cách nào để thay đổi tên miền "www.example.com" mặc định để thử nghiệm trong đường ray?

Có cách nào trong sạch để thử nghiệm chỉ định tên máy chủ lưu trữ truy cập không?

Trả lời

23
@request.host = 'user.myapp.com' 
+17

'host! 'user.myapp.com'' làm việc cho tôi – deb

+2

Trong một spec điều khiển, tôi gặp lỗi khi cố gắng sử dụng 'host!'. Đặt '@ request.host' giống như câu trả lời gợi ý làm việc. –

+6

Và làm cách nào để sử dụng nó với RSpec? Ý tôi là, tôi định cấu hình nó ở đâu? cảm ơn nhiều! – FRAGA

4

Tôi tin rằng bạn có thể thay đổi hoặc HTTP_HOSTSERVER_NAME môi trường vars thay đổi theo yêu cầu mà đi tới router:

ENV['SERVER_NAME'] = "user.myapp.com" 

Xem raw_host_with_port trong actionpack/lib/action_controller/request.rb.

1

@request.host = 'user.myapp.com' không đúng. nên sử dụng host!('user.myapp.com')

+2

Cú pháp này không hoạt động đối với tôi. Cả câu trả lời đều không được chấp nhận. Điều duy nhất hoạt động như máy chủ! ('Newhostname.com'). – jeffarena

+1

Tất nhiên bạn cần đặt chuỗi tên máy chủ trong dấu nháy đơn hoặc kép. – justingordon

2

Một điều cần nhớ là để đảm bảo sử dụng Ví dụ đúng phiên để bạn đúng cách có thể tóm lược những người giúp đỡ url.

Kiểm tra tích hợp cung cấp cho bạn phiên mặc định. Bạn có thể gọi all session methods trực tiếp từ các bài kiểm tra của bạn

test "should integrate well" do 
    https! 
    get users_path 
    assert_response :success 
end 

Tất cả những người giúp đỡ đang sử dụng ví dụ phiên mặc định, mà nếu không thay đổi, đi đến "www.example.com". Như đã đề cập máy chủ có thể được thay đổi bằng cách làm chủ! ("My.new.host")

Nếu bạn tạo nhiều phiên sử dụng phương pháp open_session, bạn luôn luôn phải sử dụng ví dụ đó để gọi các phương thức helper. Điều này sẽ đóng gói đúng yêu cầu. Nếu không ray sẽ gọi dụ phiên mặc định mà có thể sử dụng một máy chủ khác nhau:

test "should integrate well" do 
    sess = open_session 
    sess.host! "my.awesome.host" 
    sess.get users_url    #=> WRONG! will use default session object to build url. 
    sess.get sess.users_url  #=> Correctly invoking url writer from my custom session with new host. 
    sess.assert_response :success 
end 

Nếu bạn có ý định sử dụng các đối tượng session mặc định, sau đó bạn sẽ phải thay đổi máy chủ đó cũng như:

test "should integrate well" do 
    sess = open_session 
    sess.host! "my.awesome.host" 
    host! sess.host    #=> Set default session host to my custom session host. 
    sess.get users_url 
end 
9

Thông số tính năng, máy chủ! đã không được chấp nhận. Thêm những để rspec_helper.rb của bạn:

# Configure Capybara expected host 
Capybara.app_host = <myhost> 

# Configure actual routes host during test 
before(:each) do 
    default_url_options[:host] = <myhost> 
end 
+0

Lưu ý: Có vẻ như 'Capybara.app_host' cần bao gồm giao thức. Ví dụ. '" http: //test.domain "' thay vì chỉ '" test.domain "'. – lime

+1

cách bao gồm cổng? –

53

Tôi nghĩ rằng tất cả các câu trả lời là không đầy đủ ở đây ... Để liệt kê tất cả các trường hợp có thể:

  • Integration Specs (kế thừa từ ActionDispatch::IntegrationTest):

    host! "my.awesome.host" 
    

    Xem docs, mục 5.1 Người trợ giúp có sẵn để kiểm tra tích hợp.

  • khiển Specs (kế thừa từ ActionController::TestCase)

    @request.host = 'my.awesome.host' 
    

    Xem docs, phần 4.4 Biến thể hiện có sẵn.

  • Specs Feature (thông qua Capybara)

    Capybara.default_host = "http://my.awesome.host" 
    # Or to configure domain for route helpers: 
    default_url_options[:host] = "my.awesome.host" 
    

    Từ @AminAriana's answer

  • Xem Specs (kế thừa từ ActionView::TestCase)

    @request.host = 'my.awesome.host' 
    

    ... hoặc thông qua RSpec:

    controller.request.host = "my.awesome.host" 
    

    Xem rspec-railsview spec docs.

+0

Nhờ vào đường ray 5 và chuyển từ 'ActionController :: TestCase' thành' ActionDispatch :: IntegrationTest' đầu trang này 'Integration Specs' là vô giá đối với những người trong chúng ta với các ứng dụng đa tennant cũ.Đây là câu trả lời đầu tiên cho thấy làm thế nào để có được '@ request.host' dễ dàng chuyển đổi thành một bộ cũ hơn (bằng cách sử dụng' host! '). Đọc các tài liệu này đã không nhảy ra khỏi tôi, nhưng ở đây chúng tôi, và cảm ơn! – pjammer

1

Tôi đã thử nhiều biến thể của @request.host, host!, và post path, args, {'SERVER_NAME' => my_secret_domain} nhưng không thành công, cả hai như là kiểm tra bộ điều khiển và kiểm tra tính năng. Rất trầm trọng, như nhiều người khác đã báo cáo thành công với những cách tiếp cận đó.

Các giải pháp đối với tôi là:

request.headers["SERVER_NAME"] = my_secret_domain 
post path, args 

Tôi đang chạy ruby ​​2.1.5p273, rspec 3.1.7 và Rails 4.2.0

0

Tuy nhiên, một câu trả lời:

request.host = "user.myapp.com" 

Tôi biết nó giống như câu trả lời đúng, nhưng xin vui lòng trần với tôi. Tôi không thích hoạt động phân công trong bài kiểm tra chỉ để thiết lập mọi thứ, tôi thích một bài khai rõ ràng hơn. Điều thú vị là, stubbing như này sẽ không công việc:

allow(request).to receive(:host).and_return("user.myapp.com") 

Cá nhân tôi thích stubbing qua chuyển nhượng, cách mà tôi nhận được 2 lợi ích, một là nó sẽ được xác nhận bởi của rspec xác minh đôi, thứ hai là nó rõ ràng nói rằng đó là một sơ khai, không phải là một phần của bài tập kiểm tra.

0

Không có cách nào được đề xuất trong các câu trả lời khác tại thời điểm làm việc cho tôi. Điều này đã làm việc:

Capybara.configure { |config| config.default_host = "my.domain.com" } 
Các vấn đề liên quan