前回、データベースの作成とUsermodelの作成を行った。
また、Usermodelに入ってくる情報に対するバリデーションも作成したのが前回までのあらすじ。
今回はバリデーションという機能が正しく実装されたことを確認するために、「テスト」と呼ばれるものを作成していきたい。
テストとは
製作したアプリケーションが正常な動作を行なっているかの確認を行うこと
となっている。
テストを書くことによりバグやエラーを本番環境に落とす前に気づくことができる上に、リファクタリングの難易度も大きく下がることになる。
また、一言にテストと言っても、どういうタイミング(テスト駆動・一括テスト)で書いたほうが適しているか等、複雑な状況があるので詳しくはRailsTutorialの第3章の「テストから始める」を参照にしてみると良いかもしれない。
RailsTutorial(テストから始める)
上記URLの通り、RailsTutorialではrailsを作った際に一緒についてくる「minitest」と呼ばれるものを使用してテストを行うが、今回はより実践的にするために「RSpec」を使用してテストを作成していく。
RSpecとは
Ruby用に作成されたテスティングフレームワークのこと。
人が行うようなバグの発見などの作業を全て自動化してくれるすごい奴。(ただしテストコードは全部人が書くけど・・・)
ちなみにRSpecのRはRuby、Specはテストコードの事であり、綴りはSも大文字表記であることに注意。
RSpec専用の参考書があるのでそれを参考に勉強してみるのも良い。
Everyday Rails - RSpecによるRailsテスト入門
導入
Gemfileに以下のgemを導入する。
導入した後にはbundle exec
を行う。
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'rails-controller-testing'
end
# 以下gemは後ほど導入する
group :development do
gem 'spring-commands-rspec'
end
rspec-rails
RSpecの本体。これがないと何も始まらない。
factory_bot_rails
テストデータの作成を行うgemの一つ。
RailsTutorialではuser.ymlにテストモデルを記入していたが、RSpecではfactorybotがそれの代わりになる。
少し前までfactory_girl_railsとしてあったが、問題があった為名前が変更された。
rails-controller-testing
Rails5からは非推奨となっているassigns
とassert_template
を実行できるようにするgem。
余談だが、Rails5からはcontroller specは非推奨となり、新たにrequest specで記述することが推奨されている。
詳しくはEverydayRailsにて
Replacing RSpec controller specs, part 1: Request specs
spring-commands-rspec
RSpecのテスト実行スピードを上げるgem
このgemを導入したら bin/rails を使用せず -> bundle exec rspecを使用すること。
ちなみに
今回の開発環境ではDocker-composeを使用して開発を行っている為、ここで一度コンテナをDownしないとgemがインストールされない事象に見舞われてしまうので注意が必要。
ただ、Docker-composeを使っていない人はいつも通りサーバーを再起動すればよい。
実行
DBを作成する
導入が完了したらbin/rails db:create:all
を叩きDBを作成する。
もしここでDBが無いよエラーが発生したらconfig/datebase.yml
内の以下の文があるか確認する。
無いようであれば追加する。
# SQLiteを使っていれば以下の文を確認
test:
<<: *default
database: db/test.sqlite3
# MySQLまたはPostgreSQLを使っていれば以下の文を確認
test:
<<: *default
database: projects_test
RSpecをインストールする
DBの作成が完了したら以下を叩く
bin/rails generate rspec:install
叩いたら
.rspec
spec
spec/spec_helper.rb
spec/rails_helper.rb
の4つが作成されるのでまず.rspecを開き
--require spec_helper
--format documentation <-この一行を追加する
--format documentation
はRSpecからの出力をドキュメントに変更している。
必須事項では無いが、スペックがパス or エラーしたかがわかりやすい形式で出力されるため記入している。
spring-commands-rspecの導入
group :development
にspring-commands-rspecを導入する。
bundle installも忘れずに。
これで導入は終了。
本当に入っているかどうかはわからない為、一度bin/rspec
を打ちRSpecが走れば実装完了。
次回からテストの実装を行う。