Rspecの環境構築から必須のgemの解説と
どうもどハマりエンジニアです。
ここ最近は仕事等が忙しく更新出来ませんでしたが、仕事も落ち着いてきたので本日からまたしっかりと更新できるように頑張りたいと思います。
目次
環境構築
gemの追加(capybaraやwebdriverなど必要なgemも追加しておく)
Gemfile
スペックディレクトリ等を作成
$ bundle exec rails g rspec:install
RSpec の出力をデフォルトの形式から読みやすいドキュメント形式へ
--require spec_helper
--format documentation
これによってテストスイートの実行中にどのスペックがパスし、どのスペ ックが失敗したのかがわかりやすくなります。それだけでなく、スペックのアウトラインが美しく出力されます。
generateコマンドで一緒にスペックファイルも作成
rails generate コマンドを使ってアプリケーションにコードを追加 する際に、RSpec 用のスペックファイルも一緒に作ってもらうよう Rails を設定しましょう。
config/application.rb
• view_specs: false はビュースペックを作成しないことを指定します。代わりに システムスペック で UI をテストします。
• helper_specs: false はヘルパーファイル用のスペックを作成しないことを指定します。ヘルパー ファイルは Rails がコントローラごとに作成するファイルです。RSpec を自在に操れるようになって きたら、このオプションを true にしてヘルパーファイルをテストするようにしても良いでしょう。
• routing_specs: false は config/routes.rb 用のスペックファイルの作成を省略します。シンプルなら、このスペックを作らなくても 問題ないと思います。しかし、アプリケーションが大きくなってルーティングが複雑になってきた ら、ルーティングスペックを導入するのは良い考えです。
モデルスペックとコントローラスペックの定型コードはデフォルトで自動的に作成されます。
spec/support配下のファイルを読み込む
rails_helper.rb
上記の一文がコメントアウトされているので、コメントアウトを外してください。これでspec/support/
配下のファイルを読み込むことができます。
capybaraの設定
ブラウザの操作をシミュレートするために Capybara を使います。Capybara を 使うとリンクをクリックしたり、Web フォームを入力したり、画面の表示を検証したりすることができます。
Capybara は大変便利なRuby ライブラリで、フィーチャスペックのステップを定義したり、アプリケーションの実際の使われ方をシミュレートしたりするのに役立ちます。
これまでに見てきた gem とは異なり、Capybara には Rails の開発環境で実行可能なジェネレータ は用意されていません。Capybara をテスト環境に だけ 追加することにより、開発環境のメモリ消費を 少し軽くすることができます。次に、テストスイートに対して Capybara を読み込むように伝えなければ行けません。rails_helper を開き、Capybara のライブラリを 追加してください(訳注: 最後の行に require 'capybara/rspec' を追加しています)。
FactoryBotの設定について
rails_helper.rb
FactoryBotメソッドを使用する際に短縮して書くことができます。
# 通常FactoryBotをつけないと、メソッドを呼べない
user = FactoryBot.create(:user)
# 上の設定を追加することで、FactoryBotの記述が省略できる。
user = create(:user)
連番を持ったデータを生成する(sequence)
sequence(:email) { |n| "tester#{n}@example.com" }
モデルスペック
specモデルの書き方
spec/models/task_spec.rb
本来ならエラーメッセージを出す時には、task.valid? といったようなコードを書く必要がありますが、今回はexpect(task).to be_invalid といったように記載しているので、今回は書く必要がありません。
mudule macrosを使ってログインとログアウトを実行するマクロを使えるようにします。
rails_helper.rb
spec/system/user_spec.rb
以上がRspecを使う上で必要となる設定についてです。