表格提交后,水豚不通过标题

我正在构build一个Rails 3应用程序,它为移动设备(使用jQuery Mobile)和普通的桌面浏览器呈现不同的视图。 我正在testing黄瓜/水豚,并有单独的testing套件的移动和浏览器。 我可以在请求的HTTP头中设置一个移动的用户代理string,只需使用这里find的“头文件黑客”就可以了。

在Rails 3中使用Cucumber / Capybara,如何设置自定义的User-Agentstring?

问题…

我的移动黄瓜步骤大部分工作正常(例如,我设置移动头一步,其次移动视图呈现)。 然而,在表单提交之后,testing会呈现下一步的浏览器视图(而不是我想要的移动视图)。 我认为这可能是因为水豚在表单提交行为之后丢弃标题。

我试图通过添加一个logging器到我的控制器动作来testing这个,所以我可以看看user_agent头,如下所示:

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

我用iPhone头(买方是资源)。 在我的test.log中,我看到:

对于创build操作…

 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 

对于后续的显示操作(请注意“标题:”为空)…

 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) 

正如人们所期望的那样,“向我展示页面”步骤然后渲染浏览器页面,而不是我想要的移动页面。

我怎样才能保存标题,所以我所有的移动步骤都在我的移动testing套件中运行?

更新

Jnicklas(真正令人敬畏的Capybaragem的创造者!)回应道:

“这不仅仅是一个问题,而是一个问题。 在机架testing中,目前还没有办法实现我知道的猴子补丁短缺。 我一直在考虑为机架testing驱动程序添加一个标题选项,这将允许通过不同的标题选项。 如果你使用了大量的JavaScript,Selenium可能会更适合,并允许你自由设置用户代理,IIRC。“

https://github.com/jnicklas

https://github.com/jnicklas/capybara

2011年4月25日,这个function被添加到水豚 – 这个提交 – https://github.com/jnicklas/capybara/commit/a00435d63085ac2e74a0f64e7b7dedc0f7252ea9

您现在可以在使用自定义Capybara驱动程序时指定自定义标题。 有关代码示例,请参阅http://automagical.posterous.com/creating-a-custom-capybara-driver

下面是我们如何解决它,以及使用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)