5月25日 今日の積み上げ 腹痛再来。

## プログラミングにおけるテスト

 

・テストとは

プログラムが意図したとおりに動くことを確かめること

 

本番の環境で実際に作動するプログラムを「プロダクションコード」

 

テストを行うためのプログラムを「テストコード」

 

RSpec

Rubyを元に作成されたテストに特化した言語

rspec-rails」というGemをインストールすると利用できる

 

RSpecによるテストコードで書かれたファイルのことを、specファイルと呼ぶ

 

 

・テストコード

テストコードを用いることでプログラムによる想定していない動作を確認することができる

 

バグを確認することは非常に大切である

 

ひとつのプロダクションコードに対してひとつのテストコードが必要になる

 

単体テスト

ひとつのプログラムのまとまりに関して、それ単体が正常に動くか確かめるテストのこと

 

・統合テスト

複数のプログラムが連動して行われる処理が意図したとおりに行われるかを確かめるテストのこと

 

rails_helper.rb

共通の設定を書いておくファイル

 

・spec_helper.rb

共通の設定を書いておくファイル。RSpecRailsなしで利用する際に使用する

 

rails g rspec:install

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形式のデータを準備。

ファイル名は、〇〇.json.jbuilder

 

ポイント④

JavaScriptでレスポンスを受け取り、HTMLを操作してTODOを追加

 

・respond_to

「リクエストがHTMLのレスポンスを求めているのか、JSONのレスポンスを求めているのか」を条件に条件分岐をしてくれる

 

・$.ajax

jQueryで非同期通信を行うための記述

 

・doneとfail

 

 

そして腹痛再来。

明日おかしかったら処方してもらった薬の服用を一度やめてみて、その後もおかしかったらもう一度病院に行きます。