RSpec の基本的な使い方

最近、RSpec を学習していたので調べたことまとめ

まずは

おそらくここが正式なドキュメントサイト
(参考) RSpec: Behaviour Driven Development for Ruby

RSpec の初期設定


% bundle exec rspec --init
  create   spec/spec_helper.rb
  create   .rspec

テストプログラムは作成された spec ディレクトリに配置するのが基本

テストプログラム


テストプログラムのファイル名はテスト対象のファイル名に "_spec" をつけるのが慣例ぽい (例: hello.rb => hello_spec.rb)
テストプログラムは単に spec と表現されるのをよく見る
以下、簡単な spec の例

require 'hello'

describe 'Hello#message' do
  it 'returns hello message' do
    expect(Hello.new.message).to eq 'Hello World!'
  end
end

describe/context/example/it を利用してテストケースをグループ分けしていく
(参考) RSpecの(describe/context/example/it)の使い分け

テスト対象のロードについて

テスト対象の require をどこに記述すればよいのかしばらく悩んでいた

結論

各 spec ファイルに require 'spec_helper' は記述しない
各 spec ファイルの先頭でテスト対象モジュールを require する
モジュールのパスに変更があったときは -I オプションを指定して $LOAD_PATH を変更することで対応する

経緯

spec_helper.rb に記述して一括管理するのがよい?
こうすると、モジュールのディレクトリ変更でパスが変わり、全 spec ファイルを修正することになるリスクを減らせるかもしれない
しかし、この方法だと部分的なテストを行うときに全モジュールをロードするのが負担にならないか?

ちなみに RSpec はデフォルトで lib と spec を $LOAD_PATH に追加する
なので lib 配下のファイルはパスなしでよい (例: lib/hello.rb => require 'hello')
(参考) RSpecコードリーディング(第1部:RSpec)

各 spec に require 'spec_helper' を記述しない方がいいという意見も見かけた
その場合は、.spec ファイルに以下のデフォルトオプションを追加する

--require spec_helper

試してみようとしたら rspec --init で作成されたデフォルトの .spec にすでに記述されていた

http://rspec.info の Let's get started! を見ると、spec で require 'spec_helper' しないし、かわりにテスト対象モジュールを require してるから、それが想定している基本的な使い方なのだろう

いろいろあさっていたら、3.5 で config.when_first_matching_example_defined が追加されたから、一部の spec でしか使用しないセットアップロジックはこれ使うといいよ、という旨の記事をドキュメントサイトのブログで見つけた
(参考) RSpec 3.5 がリリースされました!

まだ勉強段階なので必要ないけど、今後必要になるかもしれない
頭の片隅に置いておこう