2011-04-20 17 views
45

我正在構建一個Rails 3應用程序,它爲移動設備(使用jQuery Mobile)和常規桌面瀏覽器呈現不同的視圖。我正在使用Cucumber/Capybara進行測試,併爲移動設備和瀏覽器分別提供測試套件。我能夠在請求的HTTP標頭設置移動用戶代理字符串就好用「頭砍」在這裏找到...水豚表單提交後沒有通過標題

Using Cucumber/Capybara in Rails 3, how do I set a custom User-Agent string?

問題... ...

我的大多數移動黃瓜步驟工作正常(例如,我設置移動頭一步,然後移動視圖呈現)。然而,在表單提交之後,測試會呈現下一步的瀏覽器視圖(而不是我想要的移動視圖)。我認爲這可能是因爲水豚在表單提交行爲之後丟棄了標題。

我試圖通過添加一個記錄器,以我的控制器行動,以測試這個,所以我可以看看USER_AGENT頭,如下所示:

def show 
    # … 
    logger.info("Headers: #{request.user_agent}") 
    # … 
end 

我用過iPhone頭(買方是資源)。在我的test.log中我看到:

對於創建行動...

Started POST "/buyers" for 127.0.0.1 at 2011-04-19 16:49:18 -0700 
Processing by BuyersController#create as HTML 
    #... 
Headers: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7 
    #... 
Redirected to http://www.example.com/buyers/1 
Completed 302 Found in 7ms 

對於後續show動作(注 '頭:' 爲空)...

Started GET "/buyers/1" for 127.0.0.1 at 2011-04-19 16:49:18 -0700 
Processing by BuyersController#show as HTML 
#... 
Headers: 
#... 
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 1.4ms) 

正如人們所預料,'顯示我的頁面'步驟然後渲染瀏覽器頁面,而不是我想要的移動頁面。

如何保留標題,以便我所有的移動步驟都可以在我的移動測試套件中運行?

更新

Jnicklas(!真正真棒水豚寶石的創建者)迴應說:

「這是一個多問題的一個問題,TBH。在機架測試中,目前沒有辦法實現我知道的猴子補丁短缺。我一直在考慮爲機架測試驅動程序添加一個標題選項,這將允許傳入不同的標題選項。如果您使用的是大量的JavaScript,硒可能是更好的選擇呢,並允許您設置用戶代理自如,IIRC。」

https://github.com/jnicklas

https://github.com/jnicklas/capybara

回答

2

下面是我們如何修復它,用JavaScript來的工作,以及(注意,在你After塊使用remove_headers):

module CapybaraHeadersHelper 
    def add_headers(headers) 
    headers.each do |name, value| 
     case page.driver.class.to_s 
     when "Capybara::RackTest::Driver" 
     page.driver.options[:headers] ||= {} 
     page.driver.options[:headers][name.to_s] = value 

     when "Capybara::Driver::Webkit" 
     page.driver.browser.header name, value 

     end 
    end 
    end 

    def remove_headers(headers) 
    headers.each do |name| 
     case page.driver.class.to_s 
     when "Capybara::RackTest::Driver" 
     page.driver.options[:headers] ||= {} 
     page.driver.options[:headers].delete name.to_s 

     when "Capybara::Driver::Webkit" 
     page.driver.browser.header name, nil 

     end 
    end 
    end 
end 

World(CapybaraHeadersHelper)