【问题标题】:Browser gem testing with capybara使用 capybara 进行浏览器 gem 测试
【发布时间】:2016-05-06 02:43:05
【问题描述】:

我正在使用 gem Browser 检测移动设备并将它们重定向到 Rails 应用程序上的不同着陆点。我正在使用的代码是这个:

Rails.configuration.middleware.use Browser::Middleware do
  redirect_to mobile_landing_path if browser.device.mobile? || browser.device.ipad? || browser.device.tablet?
end

现在我需要使用 Rspec 和 capybara 进行功能测试,在这里我有点迷失了。非常感谢您的帮助。

我现在的测试是使用capybara user agent,看起来像这样:但它似乎仍然是基地着陆而不是移动着陆

feature 'Visiting the site from an' do
 context 'Android device' do
  background do
   set_user_agent(:android)
  end

  scenario 'I should be redirected to mobile landing' do
    visit root_path
    expect(page).to have_current_path(mobile_landing_path)
  end
 end
end

【问题讨论】:

  • 你到底想测试什么,你尝试了什么,你遇到了什么错误? (你的逻辑也似乎倒退了——如果浏览器是移动的,我认为你想重定向到 mobile_landing_path?)
  • 我已经更正了逻辑并添加了我想要解决的测试
  • 您确定浏览器和 Capybara-user_agent 将“Android”明确定义为移动设备吗?您是否尝试过专门将测试设置为其他移动代理(如 iOS)并测试是否有效?
  • 同样的结果,但是谢谢
  • 您对 set_user_agent 的定义是什么?也不要将 eq 与 current_path 一起使用,当您使用启用 JS 的驱动程序时,它会让您头疼,而是习惯使用 have_current_path 匹配器 - expect(page).to have_current_path(mobile_landing_path)

标签: ruby-on-rails ruby capybara


【解决方案1】:

浏览器 gem 中间件只会在 HTTP_ACCEPT 标头设置并匹配 %r[(text/html|/)] 时运行。默认情况下,机架测试驱动程序不设置任何标题。您可以覆盖提供的驱动程序注册,如

Capybara.register_driver :rack_test do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'HTTP_ACCEPT' => 'text/html' })
end

或者您可以创建一个新的驱动程序注册

Capybara.register_driver :rack_test_with_html_accept do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'HTTP_ACCEPT' => 'text/html' })
end

然后将 driver: :rack_test_with_html_accept 元数据添加到需要设置该标头的测试中

feature 'Visiting the site from an', driver: :rack_test_with_html_accept do
  ...
end

【讨论】:

  • 谢谢先生,你让我开心
  • 就像一个简单的注释更喜欢使用新的语法:Capybara::RackTest::Driver.new(app, headers: { 'HTTP_ACCEPT' => 'text/html' }) 但是答案真的很好,谢谢@TomWalpole
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2014-04-04
相关资源
最近更新 更多