RSpecの中でよく使う機能をいくつか紹介します。
🍣 RSpecでスタブの作成
allow
メソッドでスタブ(テストの際、そのモジュールの代わりに用いる代用品)を構築できます。
RSpec.describe "Specifying a return value" do |
allow_any_instance_of
を使うと生成されたインスタンスすべてに対して、スタブを設定できます。
RSpec.describe "allow_any_instance_of" do |
🐹 例外処理のテスト
エラーを通知するような場合のRSpecは次のように記述します。
RSpec.describe "calling a missing method" do |
🐯 ログのテスト
Railsでログのテストを行いたい場合は次のように記述します。
it 'writes some message in log' do |
🗽 FactoryGirlで連番を付ける
FactoryGrilで同じ値にならないように連番をつけていくのはsequence
です。
sequence(:email) { |n| "person#{n}@example.com" } |
🏀 aggregate_failures
:テストをまとめて検証
RSpec 3.3からの新機能aggregate_failures
を使うと
- テストのセットアップ部分を共通化(毎回実行しないように分離)
- 複数テストを書いて一部が失敗してもすべて検証
を実現できます。
require 'spec_helper' |
これを全体に適用する場合は、spec/spec_helper.rb
に次のように記述します。
RSpec.configure do |config| |
🐮 文字列・配列の後ろ側のマッチャー:end_with
end_with
は文字列・配列の後ろ側が期待どおりかをチェックするためのマッチャー(matcher)です。
expect("this string").to end_with "string" |
🎃 時間の掛かったSpecを表示する
RSpecの実行後に、時間の掛かったSpecをn件表示する設定です。プロジェクト直下の.rspec
に以下を追記します。
--profile 任意の数 |
🎉 警告をエラーにする
RSpecで警告が発生する場合はエラーにする設定。spec/rails_helper.rb
に以下を追記。
RSpec.configure do |config| |
🤔 補足:it
とspecify
の使い分け
人間の読みやすい自然言語的な使い分けを心がける。
it
=> itを主語として使うと自然な場合に使うspecify
=> 明示する、明記するなどの意味。itを主語似できないような場合に使う
🎳 補足:初心者向けドキュメント
Everyday Rails - RSpecによるRailsテスト入門
RSpecの書き方をサンプルアプリケーションを例に順番に学ぶことができる電子書籍です。RSpecを書き始めた人が最初に読むのに最適な日本語ドキュメントです。
🐞 補足:実践的なRSpecスタイルガイド
可読性が高く、無駄のない効率的なテストを作っていくのに適したRSpecのスタイルガイドです。RSpecを書いていく中で身についたノウハウが詰まっているので初心者〜中級者向けにオススメです。
😎 参考リンク
- Returning a value - Configuring responses - RSpec Mocks - RSpec
- Any Instance - Working with legacy code - RSpec Mocks - RSpec
- What are mock and stub used in unit testing?
- Aggregating Failures
- Rspecの”should”か”expect”か。”it”か”specify”か