RSpecでよく使うマッチャーを10個厳選してまとめておきます。
ここで紹介するマッチャーはごく一部ですので、あしからず。
#紹介するマッチャー
今回紹介するマッチャーは下記10個です。
①be_valid
②include
③eq
④have_content
⑤have_link
⑥have_button
⑦have_css
⑧click
⑨have_current_path
⑩change
#be_valid
「有効か」
を確認できます。
具体的には、バリデーションチェックでの返り値がtrueであることを確かめます。
it "有効なuserの場合は保存されるか" do
# build(:user) はFactoryBotで作ったデータ
expect(build(:user)).to be_valid
end
FactoryBotで作ったデータが有効であるか確認して、trueが返ってきたら、テスト成功です。
#include
「配列に存在するか」
を確認できます。
たとえば、バリデーションチェックでのエラーメッセージは配列で返ってくるので、エラーメッセージに指定の値が存在するかを確認できます。
it "nameが空白の場合にエラーメッセージが返ってくるか" do
# userにnameカラムを空で保存したものを代入
user = build(:user, name: nil)
# バリデーションチェックを行う
user.valid?
# nameカラムでエラーが出て、エラーメッセージに"を入力してください"が含まれているか?
expect(user.errors[:name]).to include("を入力してください")
end
このように、エラーが出たときにエラーメッセージ(expectの引数)に、指定の値が存在するか確認して、存在していればテストは成功です。
#eq
「一致するか」
を確認できます。
比較するのはexpectの引数
とeqの引数
です。
it '1 + 1 は 2 になる' do
expect(1 + 1).to eq 2
end
expectの引数とeqの引数が一致すれば、テストは成功です。
#have_content
「文字列が存在するか」
を確認できます。
ページの中に、指定した文字列があるか確認したいときによく使います。
it "見出しがあるか" do
expect(page).to have_content "投稿一覧"
end
expect(page)で、今いるページを指定できます。
pageの中に"投稿一覧"が存在していれば、テスト成功です。
#have_link
「リンクが存在するか」
を確認できます。
have_linkでは、href属性を指定することもできるので、リンク部分の値またはリンク先のパスで、テストを行えます。
# リンクの値を指定
it "ユーザー一覧へのリンクが表示されているか" do
expect(page).to have_link "ユーザー一覧"
end
# リンク先のパスを指定
it "投稿一覧へのリンクが表示されているか" do
expect(page).to have_link "", href: posts_path
end
pageの中に指定の値があればテスト成功です。
#have_button
「ボタンが存在するか」
を確認できます。
have_のボタンバージョンです。
it "投稿ボタンがあるか" do
expect(page).to have_button "投稿"
end
#have_css
「cssが存在するか」
を確認できます。
cssのclass名などを指定することができるので、cssの確認をしたいときなどに使われます。
it "切り替えタブがあるか" do
expect(page).to have_css '.tab'
end
pageに'.tab'が存在すればテストは成功です。
#click
「クリック」
を行えます。
click_link
やclick_button
で、クリックする対象を選択してクリックを行い、その後の挙動をテストします。
# 投稿一覧リンクをクリック
click_link "投稿一覧"
# 投稿ボタンをクリック
click_button "投稿"
あくまで補助的に使われます。
#have_current_path
「パスを取得」
できます。
クリックした後の、リンク先が正しいかの確認でよく使われます。
it "投稿一覧のリンク先は正しいか" do
# 投稿一覧リンクをクリック
click_link "投稿一覧"
# pageのurlを確認
expect(page).to have_current_path posts_path
end
pageのリンクが正しければテスト成功です。
#change
「変動するか確認」
を確認できます。
削除のテストなどでよく使われます。
削除のテストでは、削除を実行して、データベースの数が減っているか確認します。
it "削除されるか" do
# データベースが変動したかを確認
expect { post.destroy }.to change(Post, :count).by(-1)
end
expect { post.destroy }
でpostを削除して、change(Post, :count).by(-1)
で、postのデータベースからデータが1つ減っているかを確認していて、減っていればテスト成功です。
#まとめ
####今回紹介したマッチャーは下記10個
①be_valid
②include
③eq
④have_content
⑤have_link
⑥have_button
⑦have_css
⑧click
⑨have_current_path
⑩change
冒頭でも触れましたが、今回紹介したマッチャーはごく一部で、マッチャーはまだまだありますので、テスト項目にあわせて調べながら覚えていきましょう。
RSpec系の記事他にもありますので、よかったらどうぞ!
[Rails]RSpecでテストを行う準備(FactoryBot使用)
[Rails]RSpecでモデルのテスト(FactoryBot使用)