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 がリリースされました!
まだ勉強段階なので必要ないけど、今後必要になるかもしれない
頭の片隅に置いておこう