5月25日 今日の積み上げ 腹痛再来。
## プログラミングにおけるテスト
・テストとは
プログラムが意図したとおりに動くことを確かめること
本番の環境で実際に作動するプログラムを「プロダクションコード」
テストを行うためのプログラムを「テストコード」
Rubyを元に作成されたテストに特化した言語
「rspec-rails」というGemをインストールすると利用できる
RSpecによるテストコードで書かれたファイルのことを、specファイルと呼ぶ
・テストコード
テストコードを用いることでプログラムによる想定していない動作を確認することができる
バグを確認することは非常に大切である
ひとつのプロダクションコードに対してひとつのテストコードが必要になる
ひとつのプログラムのまとまりに関して、それ単体が正常に動くか確かめるテストのこと
・統合テスト
複数のプログラムが連動して行われる処理が意図したとおりに行われるかを確かめるテストのこと
・rails_helper.rb
共通の設定を書いておくファイル
・spec_helper.rb
共通の設定を書いておくファイル。RSpecをRailsなしで利用する際に使用する
RSpec用設定ファイルの作成コマンド
rspec, spec, spec/spec_helper.rb, spec/rails_helper.rbが 生成される
・bundle exec rspec
RSpecを実行する際のコマンド(全テスト実行:オプション無しのデフォルト動作)
## モデルクラスのテストコードを書く
・describe
do ~ endまでのテストのまとまりを作る
・itとexample
itはexampleと呼ばれる実際に動作するテストコードのまとまりを表す。itの後の""の中にそのexpamleの説明を記述
・エクスペクテーション
実際に評価される式のこと。it do ~ endの間に記述
・expect(X).to eq Y
エクスペクテーションの文法。Xの部分に入れた式の値がYの部分の値と等しければ、テストが成功する。
eqの部分はマッチャという
・マッチャ
エクスペクテーションの中でテストが成功する条件を示す。例えばeqは等しければと言う意味になる。
include(含んでいれば)や、valid(バリデーションされれば)など複数のマッチャが存在する
・valid?メソッド
ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に「バリデーションにより保存ができていないじょうたいであるか」を確かめることができる
・errorsメソッド
バリデーションにより保存ができない状態である場合、なぜ出来ないのかを確認することができる
・includeマッチャ
引数にとった値がexpectの引数である配列に含まれているかを確認することができる
・factory_bot
簡単にダミーのインスタンスを作成することができるGem
・buildメソッド
引数にシンボル型で取ったクラス名のインスタンスを、factory_botの記述を元に作成する
・createメソッド
buildとほぼ同じ働きをしますが、createの場合はテスト用のDBに値が保存される。
一回のテストが実行され、修了する毎にテスト用のDBの内容はロールバックされる
・(★重要)テストコードを書く際の原則
①書くexampleで期待する値は1つ
②期待する結果をはっきりわかりやすく記述
③起きてほしいことと起きてほしくないことの両方をテストする
④境界値をテストする
⑤可読性を考えつつ、適度にDRYする
・be_validマッチャ
expectの引数にしたインスタンスが全てのバリデーションをクリアする場合にパスするマッチャ
## コントローラーのテストコードを書く
・rails-controller-testing
コントローラーのテストする際に使用するGem
・getメソッド
・response
example内でリクエストが行われた後の遷移先のビューの情報を持つインスタンス
・render_templateマッチャ
・assignsメソッド
コントローラーのテスト時、アクションで定義しているインスタンス変数をテストするためのメソッド。
引数に、直前でリクエストしたアクション内で定義されているインスタンス変数をシンボル型で取る。
通常はexpectメソッドの引数として利用する。よく使用するメソッド
・create_list
factory_botの設定ファイルに存在しているリソースを複数作成したい場合に利用する。
第一引数に作成したいリソースをシンボル型で、第二引数に作成したい個数を数字で渡す
・Fater
emailや電話番号、名前などのダミーデータを作成するためのGem
・matchマッチャ
引数に配列クラスのインスタンスをとり、expectの引数と比較するマッチャ
## 非同期通信
・非同期通信(Ajax)
リクエスト後にレスポンスが帰ってきた際、ブラウザが再読込されることなく通信が行われる通信方法
・JSON
データ交換を行うためのデータ記述形式の一種
ポイント①
非同期通信ではJavaScriptのメソッドを利用してリクエストを行う。
リクエストに対してのレスポンスはJSON形式で返してもらうようにリクエストに含める
・デフォルトアクション
HTMLの要素を操作した際に定められている挙動
ポイント②
コントローラーでJSON形式のデータを用意する
ポイント③
レスポンスするためのJSON形式のデータを準備。
ポイント④
JavaScriptでレスポンスを受け取り、HTMLを操作してTODOを追加
・respond_to
「リクエストがHTMLのレスポンスを求めているのか、JSONのレスポンスを求めているのか」を条件に条件分岐をしてくれる
・$.ajax
jQueryで非同期通信を行うための記述
・doneとfail
そして腹痛再来。
明日おかしかったら処方してもらった薬の服用を一度やめてみて、その後もおかしかったらもう一度病院に行きます。