使用 Cucumber 和 Capybara-Webkit 在 Rails 4 上进行 typeahead.js 测试失败

Posted

技术标签:

【中文标题】使用 Cucumber 和 Capybara-Webkit 在 Rails 4 上进行 typeahead.js 测试失败【英文标题】:typeahead.js test failing on Rails 4 with Cucumber and Capybara-Webkit 【发布时间】:2014-03-02 17:40:47 【问题描述】:

我有以下 Cucumber 功能使用 typeahead.js 测试输入表单:

@javascript
Scenario: Creating a battery using typeahead
  When I create a new battery using typeahead
  Then I should be on the show battery page
  And I should see the battery created message

第二步测试失败,错误信息如下:

ActiveRecord::RecordNotFound (ActiveRecord::RecordNotFound)
./features/step_definitions/admin/car_part_steps/battery_steps.rb:37:in `/^I should be on the show battery page$/'
features/admin/creating_car_parts/creating_batteries.feature:20:in `Then I should be on the show battery page'

相关步骤定义如下:

When /^I create a new battery using typeahead$/ do
  select_from_typeahead :field => 'battery_manufacturer_typeahead',
    :select => @manufacturer.name
  fill_in 'Type', :with => '700W'
  click_button 'Create Battery'
end

Then /^I should be on the show battery page$/ do
  battery = Battery.find_by_type_and_manufacturer_id!('700W', @manufacturer.id)
  current_path.should == admin_battery_path(battery)
  page.should have_content(battery.type)
end

select_from_typeahead 函数如下:

def select_from_typeahead(params)
  params[:js_field] ||= params[:field]
  params[:select_typeahead] ||= params[:select]
  fill_in params[:field], :with => params[:select][0, 2]
  page.execute_script "$('##params[:js_field]').trigger('focus')"
  page.execute_script "$('##params[:js_field]').trigger('keydown')"
  sleep 0.5
  page.execute_script "$('.tt-suggestion:contains(\"#params[:select_typeahead]\")').trigger('mouseenter').trigger('click')"
end

问题似乎与预输入本身没有任何关系,因为代码在浏览器中工作,如果我添加一些调试输出,我注意到电池在运行时的第一步中被保存到数据库中测试也是如此,它只是在第二步运行之前神秘地消失了。

我认为这是 database_cleaner 的问题,因为我知道在设置为使用事务时它与 Javascript 不兼容,但我已经尝试将其设置为使用截断并禁用事务装置,但它仍然没有工作。

我的 features/support/env.rb 目前看起来像这样:

require 'simplecov'
SimpleCov.start 'rails'

require 'cucumber/rails'

Capybara.default_selector = :css
Capybara.javascript_driver = :webkit

ActionController::Base.allow_rescue = false

Cucumber::Rails::World.use_transactional_fixtures = false
DatabaseCleaner.strategy = :truncation

Cucumber::Rails::Database.javascript_strategy = :truncation

我的环境如下:

rails 4.0.2
cucumber 1.3.10
cucumber-rails 1.4.0
capybara 2.2.0
capybara-webkit 1.1.0
database_cleaner 1.2.0

我是否遗漏了什么,是否有其他方式 database_cleaner 可能仍会干扰我的测试,或者完全是我没有想到的其他方式?

非常欢迎任何想法!

【问题讨论】:

【参考方案1】:

我认为这与数据库清理器无关。在场景结束之前不会进行清理。要进行调试,我强烈建议您安装Capybara Screenshot,这样您就可以准确地看到页面中发生了什么。它为您提供了方法screenshot_and_open_image,您可以使用它来弹出打开浏览器在那个确切时刻的样子的图像。我的猜测是:

    由于时间问题,您的 jQuery 没有按照您的预期执行 - 您是否尝试过更长的暂停? 您的事务未提交。您是否查看过 test.log 以查看事务是否已提交? 您的表单是否未通过验证?尝试在I should be on the show battery page 步骤的开头添加screenshot_and_open_image 以查看。我使用的另一件事是这样的共享步骤,以便我可以在我的场景中添加屏幕截图以进行调试:

And /^I take a screenshot$/ do
  Capybara::Screenshot.screenshot_and_open_image
end

【讨论】:

以上是关于使用 Cucumber 和 Capybara-Webkit 在 Rails 4 上进行 typeahead.js 测试失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cucumber 和 SpringBoot 进行每次测试的数据源

使用 cucumber 测试不同屏幕尺寸(设备)的行为

Cucumber + Capybara + Selenium:选择文本

使用 ZombieJS 的 Cucumber.js 场景中的回调问题

使用 Cucumber 和 Capybara-Webkit 在 Rails 4 上进行 typeahead.js 测试失败

Cucumber/Calabash-iOS 和 Xamarin.iOS