6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails]RSpecでよく使うマッチャー10選

Posted at

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_linkclick_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使用)

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?