TECH EXPERT 17日目 テストコード(コントローラー単体、複合)
※復習した時に更新してもうちょい見栄えよくします
コントローラーのテストコード書く方針
あるアクションにリクエストを送ったとき、想定通りのレスポンスが生成されるかどうかを確かめる。
exampleの整理が重要
Request Spec を使う
get
get 〇〇_pathのように、どこのパスにリクエストを送りたいかを記述
response
リクエストに対するレスポンス内容の確認
status
response.statusと実行することによって、そのレスポンスのステータスコードを出力 HTTPステータスコード 200〜299成功 400〜エラー
body
response.bodyと記述すると、ブラウザに表示されるHTMLの情報を抜き出せる
複合テストコード
System Specを記述するためには、CapybaraというGemが必要である。
visitで実際にアクセスしたいページに遷移できる。
visit 〇〇_path
pageは、visitで訪れた先のページの見える分だけの情報が格納されている。
have_contentはvisitで訪れたpageの中に取得したい文字列があるかどうかを判断できる。
expect(page).to have_content('X')と記述すると、visitで訪れたpageの中に、Xという文字列があるかどうかを判断
検証ツールでフォームの名前を取得して、
fill_inを用いて文字列を入力することができる。
fill_in 'フォームの名前', with: '入力する文字列'
find().clickはクリックしたい要素を指定することで、実際にクリックすることができる。
changeはモデルのレコードの数がいくつ変動するのかを確認することができる。
expect{ "何かしらの動作" }.to change { モデル名.count }.by(1)と記述することによって、モデルのレコードの数がいくつ変動するのかを確認
現在いるページのパスを示す。expect(current_path).to eq root_pathと記述すれば、今いるページがroot_path
hoverで、特定の要素にカーソルをあわせたときの動作を再現できる。
※ログイン機能を確認する場合は、buildではなくcreateであらかじめユーザーを作成する必要あり
ツイートの結合テストコード
have_selector
指定したセレクタが存在するかどうかを判断するマッチャ
検証ツールで要素を確認しとく
ツイート編集のテストコード
have_link
expect("要素").to have_link 'ボタンの文字列', href: "リンク先のパス"と記述することで、要素の中に当てはまるリンクがあることを確認できます
have_no_link
have_linkの逆で、当てはまるリンクがないことを確認します。expect("要素").to have_no_link 'ボタンの文字列', href: "リンク先のパス"
PicTweetにおいてこのhoverすべきクラスは.more
しかしながらログインしているユーザー以外のツイートも対象になってる
※誰が何をリクエストできるのかユーザー目線で考える
↓ findでなくallを使う
all
all("クラス名")でpageに存在する同名のクラスを持つ要素をまとめて取得できます。そしてall("クラス名")[0]のように添字を加えることで「◯番目のmoreクラス
ツイート削除テストコードの場合
find_link().click
a要素で表示されているリンクをクリックするために用います。find_link("リンクの文字列", href: "URL").clickといった形で使います。find().clickと似ていますが、find_link().clickはa要素のみに対して用いることができます。
ツイート詳細表示
コメントの結合テストに関しては、ツイートの結合テストと同様の記述
テストコード コントローラーまとめ
基本的にはページごとに
ユーザーがどんな操作をするか
どういう結果になるか(したいか)を全部ユーザー目線でexampleの整理して
それに伴うマッチャ(調べればOK)と記述(調べればモーマンタイ)をぶち込んで
ターミナルで動作できるか確認するだけ
サポートモジュール
RSpecにある メソッドをまとめる機能
重複してる記述をまとめられる