テストとは
記述したコードが意図した通りに動作するかを確認するもの
テストを行わないで世に出るサービスは無い
Rspecを利用する
利用する際にはGemのrspec-railsのGemをインストールすることで使用できる。
メリット
仕様漏れを防げる
リファクタリングや機能追加がしやすくなる
心がけること
必然的に記述コードが増えるので開発時間が長くなるのは仕方ない、しかしそれを超えるメリットやリスクヘッジがある
同じような記述のコードが増えるがリファクタリングしすぎてしまうと何のテストかわからなくなってしまうので、テストコードはわかりやすさ重視で記述する。
種類
単体テストと統合テストがある
RSpecの設定
$ rails g rspec:install
RSpecの設定ファイルを作成
下記のファイルが作成される
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
共通の設定はrails_helper.rbに記述し
spec_helper.rbも同じく共通の設定を記述するところですがRails無しで使用する際のもの
RSpecに以下を追加
--format documentation
RSpecの動作確認
$ bundle exec rspec
下記のような出力があれば準備完了
No examples found.
Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures
テストコードの例
1+1が2になることをテストする場合
describe "hogehoge" do
it "1 + 1は2になること" do
expect(1 + 1).to eq 2
end
end
describeというキーワードでテストをグループ化
テスト1つ(example)として評価されるit do ~ endのブロックの中に、
expect(X).to eq Yという形式の式を記述。
これがテストが成功するかどうかチェックされる式(エクスペクテーション)。
describe
describeは、直後のdo ~ endまでのテストのまとまりを作る。
describeの後に続く""の中にはそのまとまりの説明を書く。
itとexample
itはexampleと呼ばれる実際に動作するテストコードのまとまりを表す。
itの後に続く""の中にはそのexampleの説明を書く。
エクスペクテーション
実際に評価される式。
it do ~ endの間に書く。
上記の式ではexpect(1 + 1).to eq 2の部分がエクスペクテーション。
xpect(X).to eq Y
エクスペクテーションの文法。
xの部分に入れた式の値がYの部分の値と等しければ、テストが成功。
eqの部分を、マッチャと言う。
マッチャ
エクスペクテーションの中で、テストが成功する条件を示す。
例えばeqは「等しければ」という意味になる。
他にもinclude(含んでいれば)、valid(バリデーションされれば)など複数のマッチャが存在する。
valid?メソッド
valid?メソッドを利用すると、ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめることができる。
errorsメソッド
valid?メソッドの返り値はtrue/false、valid?メソッドを利用したインスタンスに対してerrorsメソッドを利用すると、バリデーションにより保存ができない状態である場合なぜできないのかを確認できる。
includeマッチャ
includeマッチャは、引数にとった値がexpectの引数である配列に含まれているかをチェックすることができるマッチャ。