capybara」カテゴリーアーカイブ

Cucumber+CapybaraでXPathを用いてセレクトボックスで選択できる値があるかどうかを調べる

<select id=”user_role” name=”user[role]”><option value=”admin”>admin</option>…</select>

とかあるときに選択できる値を持つoptionタグががあることをテストするためにXPathを使いました。正直XPathは避けていたがそれほど難しくはなさそうです。

ならば /^roleのセレクトボックスにadminが存在するはずだ$/ do
page.should have_selector(:xpath,’//select[@id=”user_role”]/option[@value=”admin”]’)
end

こちらを参考にしました。

Viewのテストには重宝しそうです。

Cucumber1.1.9, capybara1.1.2で日本語を使用するとき便利なステップの定義

たとえばadminしか新規ユーザーを作成できないという仕様で、adminの場合だけユーザー作成画面を表示できることをテストをしたい場合、結果をStep文に含めてしまうと便利なことがあります。

#language: ja

フィーチャ:新規ユーザーの作成
ユーザーとして
新規ユーザー作成画面を表示したい
roleによって新規作成できることを制限したい。

シナリオアウトライン:admin以上であればユーザー新規作成画面を表示できる。
前提 role”<role>”としてログインしている
かつ “ユーザー新規作成画面”へ行く
ならば “<message>”と表示され<boolean>はずだ

例:
| role | message | boolean |
| admin | CanCan::AccessDenied | ない |
| manager | CanCan::AccessDenied | |
| staff | CanCan::AccessDenied | |

上記の場合は表示され(る)か(ない)が入るので、ステップ定義で

ならば /^”([^”]*)”と表示されるはずだ$/ do |message|
page.should have_content(message)
end
ならば /^”([^”]*)”と表示されないはずだ$/ do |message|
page.should_not have_content(message)
end

とすると日本語に結果を含めることができてとてもわかりやすくテストが実装できます。

ちなみにユーザー関係の実装はDeviseを用い、roleによる権限はcancanを用いました。上記の例ではCanCan::AccessDeniedが表示されるかどうかをテストしていて、adminの場合は拒否されないので表示されないことが確認できます。