capybara-webkit+rspecでjavascriptをテストする

Capybara-Webkitをインストールする

Ubuntu:13.10
rails:4.1.6
rspec:2.14.2
capybara:2.3.0

必要なものをインストール

sudo apt-get install libqt4-dev (すでに入っていた)
sudo apt-get install xvfb (すでに入っていた)

Gemfile

gem 'capybara-webkit'
gem 'headless' # railsからXvfbを利用するためのGem
gem 'database_cleaner'

spec/spec_helper.rbを修正

RSpec.configure do |config|  
  .
  .
  # capybara-webkit (webkitの方が高速)
  #Capybara.javascript_driver = :selenium
  Capybara.javascript_driver = :webkit

  # Xvfb
  config.before(:suite) do
    Headless.new(:destroy_on_exit => false).start
  end

 # javascript driderとのスレッド共有のためfalseにする
  config.use_transactional_fixtures = false

テストを書いてみる(describeにjs: trueをつける)

require 'spec_helper'
include FeaturesSpecHelpers

describe 'WAF(mod_security)ログ' do
  before do
    sign_in_user
    visit waf_events_path
  end
  describe '表示', js: true do
    it { expect(page).to have_content("WAF(mod_security)ログ") }
  end
end

以下を使うとdatabase_cleanerがいらなくなるみたいだが、テストが通る時と通らないときがあるため使わなかった

spec/support/shard_connection.rbを作成する

# jsテスト実行時にはrspecとjs側で別プロセスでDB接続するため、データの共有ができない。
# 以下でその問題を解決できるらしい
# http://www.oiax.jp/rails/zakkan/testing_javascript_with_rspec_and_capybara.html
class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end

参考
http://www.oiax.jp/rails/zakkan/testing_javascript_with_rspec_and_capybara.html
http://www.workabroad.jp/posts/1138

特に指定がない限り、このサイトのコンテンツには次のライセンスが適用されます: Creative Commons Attribution-ShareAlike 3.0 License