QA@IT

Turnipで Capybara-webkitを作動させたいのですが?

3516 PV

RailsのEnd to End テストを書いています。マイブームのTurnip 注1) を使ってCucumberより簡単に書けることを感じていたのですが、JavaScriptの解釈をさせるのに Capybara-webkitを使えばよいとして、実際のxx_steps.rbでどう書けばよいのかわかりません。

RSpecでCapybara/Capybara-webkitを使うには :js => true ですが

Capybara.javascript_driver = :webkit としておけば、describe や it に :js => true がついてる奴だけ capybara-webkit を使ってくれる...

注2)

Ruby1.9以降は js: true がすっきり

context "span#touchmeをクリックすると", js: true do
    before { find("span#touchme").click }

    specify do
      within('#message') do
        expect(page).to have_content("Hello!")
      end
    end
  end

注3)

Turnipのxx_steps.rb で step節に ,js: true を入れると

step '日本語表示にする',js: true do
  click_link '日本語'
end
wrong number of arguments (2 for 1) (ArgumentError)

をくらいます。

Turnipで Capybara-webkit を使う方法を求めています。よろしくお願いします。

参考

注1) TurnipがCucumberの問題を解決しようとしている!
https://twitter.com/iR3/status/279448539090800640

注2) capybara-webkit を headless(画面なし・Xなし)で動かした
http://d.hatena.ne.jp/babie/20110430/1304136144

注3) RSpecとCapybaraでJavaScript/Ajaxをテストする
http://www.oiax.jp/rails/zakkan/testing_javascript_with_rspec_and_capybara.html

Capybara-webkitによる高速インテグレーションテストまとめ
http://d.hatena.ne.jp/sandmark/20120403/1333447180

  • xx_step.rbの中でcapybaraのdriverを変更したいというのはどのような背景があるのでしょうか?たとえば、a_step.rb(webkit)とb_step.rb(selenium)で書かれている両方のstepを利用するfeatureがあった場合、それはどちらのdriverが使われることを想定していますか?stepでdriverを定義したい理由がわかると何か代替案があるかもしれません -
  • defaultドライバの方が速いので必要なときだけJavaScript解釈のCapybara-webkitを作動させたかったのです。seleniumとの混在は想定していません。またxx.featureには抽象度の高い記述(プログラム開発者でないところの関係者、テスト専門家..向け)に限定してベタなコードは排除したいところです。 -

回答

xx_steps.rbでの指定方法ではないのですが、xx.featureにて @javascript行を入れることで Capybara-webkitを動作させることができました。

機能: javascript駆動確認
  @javascript
  シナリオ: 画面遷移時にログイン状態を確認
  前提 ログインしている
 ならば ○○画面に遷移する
  :

引き続きxx_steps.rbでの指定方法は募集中です。→ 以下の方法で解決しました。

その後 xx_steps.rbでCapybara-webkitを動作させることができました。
current_driverを書き換える方法です。

xx_steps.rbの必要な箇所で

Capybara.current_driver = :webkit

とします。

戻すには

Capybara.current_driver = :rack_test

ちなみに

Capybara.javascript_driver = :webkit

の指定ではダメでした。

また

Capybara.current_driver = :selenium

も効いたのでcapybara-webkitとseleniumの切り替えもOKでした。

参考

Let's Try 受入テスト [15]
http://oblog.objectclub.jp/?tag=letstry%E5%8F%97%E5%85%A5%E3%83%86%E3%82%B9%E3%83%88

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。