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にある メソッドをまとめる機能

 

重複してる記述をまとめられる