2

typeahead.js を使用して入力フォームをテストする次の Cucumber 機能があります。

@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

テストは 2 番目のステップで失敗し、次のエラー メッセージが表示されます。

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

ただし、この問題は typeahead 自体とは何の関係もないように見えますが、コードはブラウザーで動作するため、デバッグ出力を追加すると、テストを次のように実行すると、最初のステップでバッテリーがデータベースに保存されることに気付きます。まあ、2 番目のステップが実行される前に不思議なことに消えてしまいます。

トランザクションを使用するように設定されている場合、Javascript でうまく動作しないことがわかっているため、database_cleaner の問題だと思いますが、代わりに切り捨てを使用するように設定し、トランザクション フィクスチャを無効にしましたが、まだ機能しません。

現在、私の 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 がまだテストに干渉する可能性がある他の方法がありますか、それとも私がまったく考えていなかった別の方法ですか?

どんなアイデアでも大歓迎です!

4

1 に答える 1