プログラミングOUTPUTブログ

看護師しながらプログラミング学習しています。

テストコード

今日の学び

結合テストコード>
ユーザーの操作を再現してテストを行う

  • トップページに移動する
  • トップページにサインアップページへ遷移するボタンがある
  • 新規登録ページへ移動する
  • ユーザー情報を入力する
  • サインアップボタンを押すとユーザーモデルのカウントが1上がる
  • トップページへ遷移する
  • カーソルを合わせるとログアウトボタンが表示される
  • サインアップページへ遷移するボタンや、ログインページへ遷移するボタンが表示されていない

 

 

・SystemSpecとは結合テストコードを記述するための仕組み。
・CapybaraとはSystemSpecを記述するために必要なGem。
・visit→〇〇のページに移動することを表現できる。visit 〇〇_pathと記述。
・page→現状のページ。visitで訪れた先のページの見える文だけの情報が格納されている。
・have_content→expect(page).to have_content( ' X ' )と記述することで、visitで訪れたpageの中に、Xという文字列があるかどうかを判断するマッチャ。
・fill_in→fill_in 'フォームの名前', with: '入力する文字列'と記述することで、フォームへの入力を行うことができる。
・検証ツール→HTMLの要素や適用されているCSSのコードを確認できる。これでフォームの名前、クリックしたい要素など確認する。
・find( ).click→find("クリックしたい要素").clickと記述することで、実際にクリックができる
・change→expect{ "何かしらの動作" }.to change {モデル名.count}.by(1)と記述することで、モデルのレコードの数がいくつ変動するか確認する。
・current_path→現在いるページのパスを示す。
・hover→find("ブラウザ上の要素").hoverと記述することで、特定の要素にカーソルを合わせたときの動作を再現できる。
・have_no_content→文字列が存在しないことを確かめるマッチャ。

 

テストコード記述して一連の流れが見えるのはちょっと面白いと思ったけど、理解不足でまだ頭がこんがらがってる。MVCの流れをもう一回しっかり理解していこうと思う。

テストコード

今日の学び

 

<<テストコードを書く方針>>
モデル→インスタンスを生成し、それがモデルに規定した通り挙動になるかを確かめる
コントローラー→あるアクションにリクエストを送ったとき、想定どおりのレスポンスが生成されるかどうか確かめる

<コントローラーの単体テストコードを書く>
・Request SpecとはRspecが提供しているコントローラーのテストコードを書くために特化した手法

・get→indexアクションにリクエストすると正常にレスポンスが返ってくることを確かめるために「indexアクションにリクエストすると」を行う記述をgetを使用して行う。get 〇〇_pathと使う。どのパスに対応しているかは、rails routesコマンドで確かめる。
・response→レスポンスの内容を確認する。
HTTPステータスコード→どのような処理の結果となったのかを示すもの。正常なレスポンスかどうかを判断するために使う。
・status→response.statusでステータスコードの確認が出来る。
・body→response.bodyでブラウザに表示されるHTMLの情報を抜き出すことができる。

 

 

FactoryBot.create(:tweet)

buildではなくcreateを使うのは何で?ってなったので

→記録する範囲が違う

buildはインスタンスをメモリ上にのみ記録する

createはテストデータベース上にも保存して、データを永続化させる

 

データベースに書き込むのは時間がかかるので、データベースに保存する必要がないときはbuildを使う

今回はあらかじめデータベースにツイートが保存されている状態を考えるためcreate

テストコード

今日の学び

 

効率的にテストコードを書くために


FactoryBotやbeforeを使ってテストコードをスッキリまとめる

・FactoryBot→インスタンスをまとめることができるGem。他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用する。
・buildを使用するとインスタンスの生成ができる。ActiveRecordのnewメソッドと同じ。
・beforeを使用すると共通した記述をまとめて全てのテストコードを実行する前に、セットアップを行うことができる。定義する変数はインスタンス変数にする必要がある。
・Faker→ランダムな値を生成するGem。メールアドレス、人名、パスワードなどの値を生成。
・context→特定の条件を分けたい場合使用。使用方法はdiscribeと同じ。discribe(どのような機能について確認するか),content(どのような状況を確認したいか)
・be_valid→expectのインスタンスが正しく保存されることを判断する。
expect(インスタンス).to be_valid

 

あとはひたすらテストコードを書く練習

今日の学び

 

Rspecについて

RspecとはRubyonRailsのテストコードを書くために使うGem

・テストコードとはアプリケーションの挙動を確認するためのコードのこと

・テストコードは正常系(意図する操作を行った時の挙動を確認)と異常系(意図しない操作を行った時の挙動を確認)に大きく分類される
・テストコードの種類は単体テストコード(モデルやコントローラーなどの機能ごと)と結合テストコード(ユーザーがブラウザで操作する一連の流れ)


テストコードの記入
・describe→どのようなテストコードを書いているのか記述
・it→どのような結果になることを試しているのかを記述
・example→itに記述した内容の総称
・expect(X).to eq Y→Xの結果はYになる この部分が実際にコードを検証
・マッチャ→expectの中の記述と、結果との繋がりを表現するもの eqなど
・bundle execコマンド→たくさんのGemの依存関係を整理してくれるコマンド
rspecコマンド→テストコードを実行するコマンド
rails_helper→RSpecを利用する際に、共通の設定を書いておくファイル
・valid?メソッド→作成したデータが正しく保存されるかどうか確認するメソッド
・errorsメソッド→valid?にて判定されたデータのエラーを表示するメソッド
・full_messagesメソッド→エラーメッセージを出力するためのメソッド
・include→expect(X).to include(Y) Xの中にYという文字列が含まれているかどうかを確認することができるマッチャのこと

 

require 'rails_helper'
RSpec.describe User, type: :model do
describe 'ユーザー新規登録' do
it "nicknameが空だと登録できない" do
user = User.new(nickname: "", email: "kkk@gmail.com", password: "00000000", 〜省略〜)
user.valid?
expect(user.errors.full_messages).to include("Nickname can't be blank")
end

 

 

 

エラーメッセージを確認する時 binding.pryって何だ?ってなったので復習

デバッグをする時に使う

・binding.pryが存在する箇所でRails処理を一時停止し、その状態でコンソールを起動することができる

・確認した後は記述を消す

 

 <今日の一言>

エルレの生配信ライブめっちゃ良かった!早くライブ行きたいー

 

初ブログ!

看護師しながらプログラミング学び始めました。

15年看護師でしか働いたことなかったから、新しいこと始めるって自分にとってはすごいこと。コロナのせいもあって今の縛られた働き方じゃなく、自由な働き方を実現させるため、プログラミング学習のoutputしていこうと思います。

f:id:aj2G:20200827182636j:plain