Rspec / jQuery オートコンプリートをテストする

Shunsuke Sawada

UIにいろいろJavascript使うわけですが、やっぱりテストがね。しにくいよね。
タイプした時に候補を提案してくれるUIをテストするマクロです。
オートコンプリートとか自動補完とか呼ぶのかな。

spec/supports/fill_in_macros.rb

ruby
1
2
3
4
5
6
7
8
module FillInMacros
  def fill_autocomplete(field, options = {})
    page.execute_script %Q{ $("#{field}").trigger('focus') }
    page.execute_script %Q{ $("#{field}").val("#{options[:with]}") }
    page.execute_script %Q{ $("#{field}").trigger('keydown') }
    expect(page).to have_selector('ul.ui-autocomplete li.ui-menu-item')
    all("ul.ui-autocomplete li.ui-menu-item", text: options[:with]).first.click
  end

なぜか ui-menu-item が複数見つかる時があったので、ひとまず first で横着しました。

  
rails_helper.rb

ruby
1
2
3
4
RSpec.configure do |config|
  Dir[Rails.root.join("spec/supports/**/*.rb")].each{ |f| require f }
  config.include FillInMacros
end

  
autocomplete_spec.rb

ruby
1
2
3
4
5
feature "Autocomplete"
    scenario "fill in country", js: true do
      fill_autocomplete "#country", with: "オーストラリア"
    end
end

  

タグ付けするUI

で、これを利用してタグを設定する時によくある、
リターンを押したらinputフィールドの中でラベルっぽくなるUIのテストもやってみた。
tag-label はラベルデザインのCSSクラスという想定です。
Javascript側では、エンターを離したタイミングでタグを確定させています。

spec/supports/fill_in_macros.rb

ruby
1
2
3
4
5
6
7
8
module FillInMacros
  def fill_tag_and_enter(field, options = {})
    page.execute_script %{ $("#{field}").trigger('focus') }
    page.execute_script %{ $("#{field}").val("#{options[:with]}") }
    page.execute_script %{ $("#{field}").trigger($.Event('keyup', {keyCode: 13})) }
    expect(page).to have_css(".tag-label", text: options[:with])
  end
end

  
なかなかいいです。

4
Shunsuke Sawada

おすすめの記事

jQuery UI サーバーからデータを取得して自動補完する