2012-10-22 81 views
5

我已經把下面的代碼到我的config/environments/test.rb文件:在測試環境中設置default_url_options似乎不工作

config.action_mailer.default_url_options = { :host => "localhost:3000" } 

但是當我跑我的測試中,所有路由都使用http://test.host。我正在嘗試使用不接受http://test.host作爲有效回調URI的API,因此我需要將其更改爲正確接收API響應。任何想法爲什麼這不起作用? (我在測試套件中使用RSpec,Guard和Spork)。

編輯:可能相關 - 這是在控制器規格內完成的。

EDIT2:好像它改變的請求經由get製成後,post等測試中運行下列代碼:

Rails.logger.debug users_url 
get 'http://google.com' 
Rails.logger.debug users_url 

將產生以下輸出:

http://localhost:3000/users 
...get request related response here 
http://google.com/users 

回答

10

如今只需將他們在你test.rb像這樣:

Rails.application.routes.default_url_options[:host]= 'localhost:3000' 
+0

已確認在Rails 3.0中工作 – parhamr

+0

基於@ parhamr的評論接受。 – Nick

0

你如何運行你的測試?也許追加RAILS_ENV=test可能會有所幫助。

+0

什麼你通過追加'RAILS_ENV = test'意思? 'ENV [「RAILS_ENV」]''已經是''test'''。如前所述,我正在使用RSpec,Guard和Spork進行測試。我只運行'bundle exec guard',它加載了Spork服務器,它自動運行RSpec測試。 – Nick

0

根據我的經驗,url_options不會通過測試沒有一點駭客。

參見例如

試圖設置在測試現場時,我經常遇到這樣的問題。不過,我從來沒有使用動作郵件,所以可能有一個更簡單的方法來做到這一點。

我找到的用於設置url_options中默認語言環境的解決方案僅適用於patch actiondispatch,並強制它使用任何我想要的語言環境。你可以通過這種方式適應這你的情況:

class ActionDispatch::Routing::RouteSet 
    def url_for_with_default_url_options(options) 
    url_for_without_default_url_options(options.merge(:host => "localhost:3000")) 
    end 

    alias_method_chain :url_for, :default_url_options 
end 

我把這些代碼在規格/支持文件,以便它在RSpec的測試中使用,我也需要從我env.rb文件,以便我可以使用它在黃瓜測試以及。

請記住,這將修補它到處,在這兩個測試代碼,並在測試中運行的實際代碼,它將覆蓋爲:host關鍵是你嘗試通過任何其他設置(因爲補丁合併在選項頂部的修復程序傳入url_for)。在你的情況下,我相信這不應該是一個問題。

猴子修補不是一個非常優雅的解決方案,但是,我在所有其他失敗之後使用了這個。您可能會發現一個針對動作郵件程序的更簡單的解決方案。

相關問題