在rails测试上设置自定义用户代理

时间:2016-08-23 09:01:28

标签: ruby-on-rails capybara turbolinks rspec3 turbolinks-ios

我正在使用turbolinks-ios和Rails变体开发iOS应用。

在我的iOS应用中,我设置了自定义用户代理iPadApp并检测到Rails application controller正在使用request.user_agent.try(:index, 'iPadApp')variant设置为tablet(因为视图类似于foo.html+tablet.haml)。

我的应用程序工作正常,现在我正在尝试为我的应用程序编写功能测试,但无法正确设置用户代理。我尝试this帖子实际上是stackoverflow,但我发现它没有设置request.user_agent而是page.driver.browser.header(key, value))在request.params中设置查询参数。

在我的控制器测试中,我只需使用request.user_agent = 'iPadApp'来设置工作正常的用户代理。

如何配置测试请求以便我可以使用request.user_agent.try(:index, 'iPadApp')

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:7)

由于您未指定驱动程序,Capybara应使用rack_test。使用rack_test驱动程序,您可以在调用visit之前在测试代码中设置用户代理标头,并使用

page.driver.header('User-Agent', 'the user agent string you want')

然后应该在您的应用程序代码中访问request.user_agent。

另一种解决方案是为您的ipad测试注册特定的驱动程序

Capybara.register_driver(:ipad_rack_test) do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'HTTP_USER_AGENT' => 'User agent string' })
end

然后将您的驱动程序指定为:ipad_rack_test

答案 1 :(得分:1)

如果您要为所有测试设置用户代理,请添加此功能。您可以在spec_helper.rb配置部分中执行类似的操作(以Chrome用户代理为例)

config.before(:each) do
  Capybara.page.driver.header('user-agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36.')
end

答案 2 :(得分:0)

由于我无法发表评论或编辑,我不得不做出新答案。虽然上面的内容是正确的,但对于page.driver.header('User-Agent', 'the user agent string you want')所在的顶部,我必须使用Capybara.page.driver.header('User-Agent', 'the user-agent string you want')

希望这有帮助。