我有一個Rails應用程序,根據訪問的區域(例如www.myapp.com將以不同方式調用user.myapp.com)採取不同的行爲。在生產使用這一切工作正常,但我的測試代碼總是看到「www.example.com」的主機名。如何更改用於在rails中測試的默認「www.example.com」域?
是否有一種乾淨的方式讓測試指定它假裝訪問的主機名?
我有一個Rails應用程序,根據訪問的區域(例如www.myapp.com將以不同方式調用user.myapp.com)採取不同的行爲。在生產使用這一切工作正常,但我的測試代碼總是看到「www.example.com」的主機名。如何更改用於在rails中測試的默認「www.example.com」域?
是否有一種乾淨的方式讓測試指定它假裝訪問的主機名?
@request.host = 'user.myapp.com'
我相信你可以修改HTTP_HOST
或SERVER_NAME
環境瓦爾更改進入到路由器的要求:
ENV['SERVER_NAME'] = "user.myapp.com"
見raw_host_with_port
在actionpack/lib/action_controller/request.rb。
@request.host = 'user.myapp.com'
是不對的。 應該使用host!('user.myapp.com')
另一件事要記住的是,以確保使用正確的會話實例,這樣就可以正確地封裝網址助手。
集成測試爲您提供了默認會話。您可以直接從你的測試
test "should integrate well" do
https!
get users_path
assert_response :success
end
所有這些助手使用的是默認會話實例,如果不改變調用all session methods,去「www.example.com」。如上所述,主機可以通過主機更改(「my.new.host」)
如果使用open_session方法創建多個會話,則必須始終使用該實例調用輔助方法。這將正確地封裝請求。否則軌道會調用它可以使用不同的主機的默認會話實例:如果您打算使用默認的會話對象
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
,那麼你就必須改變這種主機,以及:
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
在功能規格中,主機!已被棄用。這些添加到您的rspec_helper.rb:
# Configure Capybara expected host
Capybara.app_host = <myhost>
# Configure actual routes host during test
before(:each) do
default_url_options[:host] = <myhost>
end
我認爲,所有的答案都在這裏不完整的......要列舉所有可能的情況:
集成規格(從ActionDispatch::IntegrationTest
繼承):
host! "my.awesome.host"
查看docs,節5.1 可用於集成測試的助手測試。
控制器功能(從ActionController::TestCase
繼承)
@request.host = 'my.awesome.host'
參見docs,第4節。4 實例變量可用。
功能規格(通過水豚)
Capybara.default_host = "http://my.awesome.host"
# Or to configure domain for route helpers:
default_url_options[:host] = "my.awesome.host"
查看規格(從ActionView::TestCase
繼承)
@request.host = 'my.awesome.host'
...或通過RSpec的:
controller.request.host = "my.awesome.host"
查看rspec-rails
view spec docs。
我嘗試了許多變化@request.host
,host!
和post path, args, {'SERVER_NAME' => my_secret_domain}
沒有成功,無論是作爲控制器測試和功能測試。非常激烈,因爲許多其他人報告說這些方法取得了成功。
對我來說,解決辦法是:
request.headers["SERVER_NAME"] = my_secret_domain
post path, args
我運行紅寶石2.1.5p273,rspec的3.1.7和Rails 4.2.0
另一個答案:
request.host = "user.myapp.com"
我知道它類似於正確的答案,但請裸露在我身上。我不喜歡測試中的賦值操作只是爲了設置,我更喜歡明確的存根。有趣的是,磕碰這樣不會工作:
allow(request).to receive(:host).and_return("user.myapp.com")
我個人更喜歡磕碰過分配,這樣,我得到2好處之一是,它會被RSpec的的驗證驗證雙,二是它明確表示這是一個存根,而不是測試練習的一部分。
在這一點的其他答案建議的方式都沒有爲我工作。這工作:
Capybara.configure { |config| config.default_host = "my.domain.com" }
'主機! 'user.myapp.com'`爲我工作 – deb 2011-08-17 22:32:39
在控制器規範中,當我嘗試使用`host!`的時候出現錯誤。雖然設置`@ request.host`就像答案一樣。 – 2012-10-01 12:43:30
我如何在RSpec中使用它?我的意思是,我在哪裏配置它?非常感謝! – FRAGA 2012-12-04 18:19:27