2011-07-24 49 views
4

我想使用法拉第和RSpec測試我們的Rails應用程序的HTTP API。法拉第需要主機的網址+端口。不幸的是,測試環境的端口一直在變化。如何在規範中以編程方式訪問當前端口?Rails端口的測試環境

回答

7

如果使用水豚您可以設置端口的spec_helper.rb像這樣:

Capybara.server_port = 1234 

參見:https://github.com/jnicklas/capybara/pull/123

+0

感謝您的回覆。不幸的是,它不適合我們這種方式。在特定的測試中我們不使用水豚。例如,我們只需調用'Faraday.new(:url =>「http:// localhost:3033」)'。我們是否需要調用'visit'或類似的東西? – Zardoz

+0

我不明白你爲什麼不使用RSpec + Capybara來測試你的API? 請參閱http://jeffkreeftmeijer.com/2011/acceptance-testing-using-capybaras-new-rspec-dsl/。 – fpauser

+0

你在哪個環境下使用Faraday? (controller-spec?model-spec?integration-spec?) – fpauser

3

有可能做到這一點的方法不止一種,但這是工作我現在:

命令

port = `lsof -p #{Process.pid} -ai TCP -as TCP:LISTEN -Fn | grep ^n | cut -c 4- | uniq`.strip 

注意您必須在之後該應用已加載 - 即,您不能在您的environment.rbapplication.rb文件中使用此功能。

解釋

基本上,這個命令的作用如下:

  • lsof是打開文件列表
  • -p #{Process.pid}它限制到當前進程的Unix命令(即你的測試網站服務器實例)
  • -ai TCP將其限制爲TCP類型的「文件」(即,打開的TCP端口)。 (注:-a是讓與PID一個搜索 - 在默認情況下,僅使用-i搜索)正在進行在聽取
  • -as TCP:LISTEN限制只是TCP端口(如反對任何開放口岸 - 喜歡你的應用程序的連接的Postgres例如)
  • -Fn它告訴只輸出「名稱」一欄,在這種情況下將是正在上
聽取了IP /端口

那個的輸出通過本身部分將是這樣的:

p12345 
n*:5001 
n*:5001 

第一行,與p開始是進程ID。沒有辦法抑制這一點。 接下來的2行(不知道爲什麼它可以輸出倍數,但我們會在一分鐘內處理它)是「名稱」列(因此爲n),後面是IP +端口。在我們的案例中(我也想象你們在測試環境中),網絡服務器收聽全部可用的本地IP,因此*。然後,它告訴我們,端口,在這種情況下,5001

最後,我們把它管道... * grep ^n消除第一行(進程ID) * cut說「從4列切在「 - 即,取出n*:回到只是的端口, * uniq只得到了一個實例

(這也將有一個結尾的新行,因此strip電話。)

用法

在我的情況下,我在我的Cucumber env.rb中使用它,重新配置ActiveMailer的URL選項,以便我的電子郵件鏈接可以在測試中正常生成爲工作鏈接:

po RT = lsof -p #{Process.pid} -ai TCP -as TCP:LISTEN -Fn | grep ^n | cut -c 4- | uniq .strip

MyApp的:: Application.configure做 config.action_mailer.default_url_options [:主機] = 「0.0.0.0:#{port}」 結束

毫無疑問,你可以做同樣的在Rspec的助手/配置中也是如此。