RSpecによるテストコードで使う各オブジェクトの説明

#本記事について
RSpecによるテストコードを実施する際に使用する各種オブジェクトの説明を本記事に載せております。

#バージョン
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0
rspec-rails 4.0.0

##describe
・describeとは、テストコードのグループ分けを行うメソッドです。
・○○について記述するという意味で、テストコードの内容の説明をしています。
・do〜endの間に入れ子構造をとることができます。

##it
・itメソッドは、describeメソッド同様に、グループ分けを行うメソッドです。
・itの場合はより詳細に、「describeメソッドに記述した機能において、どのような状況のテストを行うか」を明記します。
・すなわち実行予定と結果の予想を示しています。

##example
・exampleとは、itで分けたグループのことを指します。
・itに記述した内容のことを指す場合もあります。
・itに記述される内容の総称のことをいいます。
・exampleの整理＝itの内容の整理

##bundle exec
・Gemの依存関係を整理してくれるコマンドです。
・RSpecをはじめ、多くのGemはその他のGemと関係があり、互いに依存しています。
・bundle execコマンドを用いてGemの依存関係を整理する必要があります。

##rspec
・specディレクトリ以下に書かれたRSpecのテストコードを実行するコマンドです。
・実行するファイルを指定することも可能です。

##valid?
・valid?は、バリデーションを実行させて、エラーがあるかどうかを判断するメソッドです。
・エラーがない場合はtrueを、ある場合はfalseを返します。
・エラーがあると判断された場合は、エラーの内容を示すエラーメッセージを生成します。

##expectation
・検証で得られた挙動が想定通りなのかを確認する構文のことです。
・expect(X).to include(Y)
　「Xの中にYという文字列が含まれているかどうか」
　「Xの結果はYになる」という意味です。」


##matcher
・意図したデータと実際のデータを比較して一致もしくは不一致という結果を返すメソッドです。
・expectの中身と結果の繋がりを表現します。
・matcherは、「expectの引数」と「想定した挙動」が一致しているかどうかを判断します。
・expectの引数には検証で得られた実際の挙動を指定し、マッチャには、どのような挙動を想定しているかを記述します。
・eqの場合はXがYに等しくなる

##include
・includeは、「expectの引数」に「includeの引数」が含まれていることを確認するマッチャです。

##eq
・eqは、「expectの引数」と「eqの引数」が等しいことを確認するマッチャです。

##errors
・Valid?にて判定後のエラーを表示するメソッド
・errorsは、インスタンスにエラーを示す情報がある場合、その内容を返すメソッドです。
・確認にはrails cのコマンドをターミナル上で実行して行います。

##full_messages
・生成されらエラ〜メッセージの中からエラ〜メッセージを出力するメソッドです（エラーの原因を可視化）
・エラーの内容から、エラーメッセージを配列として取り出すメソッドです。

##rails_helper
RailsにおいてRSpecを使う時に共通の設定ができるファイル

##build
newメソッド（生成）と同様の意味

##newではなくbuildを使用する理由
・可読性の観点上使用する
・newメソッドを使用するとコードの記述数がかなり多くなるが、FactoryBot.build(:~)とすることで、コード量がかなりへる。

##create
buildとほぼ同じ働きをしますが、createの場合はテスト用のDBに値が保存されます。

##FactoryBot
テストデータの作成を手伝ってくれるgemのこと
（インスタンスをまとめることができるgem）
・FactoryBotに情報が集約されている。
→コード量が減る。わかりやすい。FactoryBotを定義することにより１行で済む。
・初めにFactorybotを定義しておくと、定義後転用できる。（共通化）

##before
・テストコードを実行する前に、セットアップを行うことができます。
・beforeはアクションが実行される前に設定できます。

##Faker
ダミーデータを自動作成してくれるgem

##context（describeにネストして書く。入れ子構造。）
特定の条件を分ける。正常系と異常系を分ける。

describe　機能についての確認
context　状況についての確認

##be_valid
・正常に完了することを判断。正常系と異常系両方使用します。
・valid?メソッドの返り値が、trueであることを期待するマッチャです。

##Request Spec
・RSpecが提供している、コントローラーのテストコードを書くために特化した手法です。

##response
・リクエストに対するレスポンスそのものが含まれます。

##HTTPステータスコード
・HTTP通信において、どのような処理の結果となったのかを示すものです。
以下ステータスコードの分類の詳細について記載があります。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

##status
・response.statusと実行することによって、そのレスポンスのステータスコードを出力できます。

##body
・response.bodyと記述すると、ブラウザに表示されるHTMLの情報を抜き出すことができます。

##System Spec
・System Spec（システムスペック）は結合テストコードを記述するための仕組みのことをいいます。

##Capybara
・System Specを記述するために必要なGemです。

##visit
・visit 〇〇_pathのように記述すると、〇〇のページへ遷移することを表現できます。

##page
・visitで訪れた先のページの見える分だけの情報が格納されています。

##have_content
・expect(page).to have_content('X')と記述すると、visitで訪れたpageの中に、Xという文字列があるかどうかを判断するマッチャです。

##have_no_content
・文字列が存在しないことを確かめるマッチャです。

##fill_in
・fill_in 'フォームの名前', with: '入力する文字列'のように記述することで、フォームへの入力を行うことができます。

##find().click
・find('クリックしたい要素').clickと記述することで、実際にクリックができます。

##change
・expect{ 動作 }.to change { モデル名.count }.by(1)と記述することによって、モデルのレコードの数がいくつ変動するのかを確認できます。

##current_path
・現在いるページのパスを示します。

##hover
・find('ブラウザ上の要素').hoverとすることで、特定の要素にカーソルをあわせたときの動作を再現できます。

##have_link
・expect('要素').to have_link 'ボタンの文字列', href: 'リンク先のパス'と記述することで、要素の中に当てはまるリンクがあることを確認できます。
・have_linkはa要素に対して用います。

##have_no_link
・当てはまるリンクがないことを確認します。expect('要素').to have_no_link 'ボタンの文字列', href: 'リンク先のパス'と記述することで、要素の中に当てはまるリンクがないことを確認できます。

##all
・all('クラス名')でpageに存在する同名のクラスを持つ要素をまとめて取得できます。

##find_link().click
・a要素で表示されているリンクをクリックするために用います。
・find_link('リンクの文字列', href: 'URL').clickといった形で使います。
・find().clickと似ていますが、find_link().clickはa要素のみに対して用いることができます。

##サポートモジュール 
以下記事をご参考ください。

https://qiita.com/narimiya/items/b897db14551191e41fb2

##参考記事

https://hirocorpblog.com/post-546/

以上です。