【问题标题】:Set custom user agent on rails testing在 Rails 测试中设置自定义用户代理
【发布时间】:2016-08-23 09:01:28
【问题描述】:

我正在使用 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')?

感谢您的任何帮助。

【问题讨论】:

  • 您在 capybara 上使用哪个驱动程序?
  • @TomWalpole 没有给出明确的驱动程序。所以我认为它使用默认驱动程序。

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


【解决方案1】:

由于您没有指定驱动程序 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

【讨论】:

  • 尽管我发现page.driver.header 调用page.driver.browser.header(源代码)[github.com/jnicklas/capybara/blob/master/lib/capybara/rack_test/…,但您的解决方案有效。我不知道为什么昨天它没有工作(我只是重新启动我的服务器)。有没有办法将User-Agent 作为visit 方法的选项传递给属性?这样,就可以传递此选项,而不是在每次访问之前设置标题。感谢您的帮助。
  • 当然我可以覆盖visit方法,我可以根据传递options设置header。
  • 不,如果您自己不覆盖visit,就无法通过它进行访问。一个更简单/更干净的解决方案可能是将标头设置放在 before 块中,因此它在每次测试之前运行(或使用特定元数据标记的测试)
  • @Engr.HasanuzzamanSumon 如果您需要这个进行大量测试,请参阅我在答案中添加的关于专门为它注册驱动程序的部分。
  • 未定义的局部变量或方法`page'
【解决方案2】:

此外,如果您希望为所有测试设置用户代理。您可以在您的 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

【讨论】:

    【解决方案3】:

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多