spec/_role
以下にspecファイルを分離してみた.
$ tree spec/
spec/
├── _role
│ ├── cloudforecast_spec.rb
│ ├── growthforecast_spec.rb
│ ├── java_spec.rb
│ ├── jenkins_spec.rb
│ ├── jmeter_spec.rb
│ ├── rails_spec.rb
│ ├── nginx_spec.rb
│ ├── rbenv_spec.rb
│ ├── supervisord_spec.rb
│ ├── td-agent-recieve_spec.rb
│ └── td-agent-send_spec.rb
├── app
│ └── app_spec.rb
├── spec_helper.rb
└── test_support
└── test_support_spec.rb
spec/_role
以下のspecファイルはshared_examples_forを使って以下な感じ.
$ cat spec/_role/jenkins_spec.rb
require 'spec_helper'
shared_examples_for 'jenkins' do
describe port(18080) do
it { should be_listening }
end
end
host毎のspecファイルはこうなる.
$ cat spec/app/app_spec.rb
require '_role/rails_spec'
require '_role/nginx_spec'
require '_role/rbenv_spec'
require '_role/td-agent-send_spec'
describe 'app' do
it_behaves_like 'rails'
it_behaves_like 'nginx'
it_behaves_like 'rbenv'
it_behaves_like 'td-agent::send'
end
Roleディレクトリに_
(アンダースコア)を付けておくことでglobパターンで除外しやすくなる.
RSpec::Core::RakeTask.new(:spec) do |t|
- t.pattern = 'spec/*/*_spec.rb'
+ t.pattern = 'spec/[!_]*/*_spec.rb'
end
spec/app/app_spec.rb
というパスがなんだかDRYじゃない- Roleじゃないほうのspecファイルで
require '_role/hoge_spec'
って省略したい
spec/_role
以下のファイルもスペックファイルとして実行される(素のrspec
コマンドはデフォルトパターンspec/**/*_spec.rb
でスペックファイルを探索する)と以下WARNINGが出力される.
WARNING: Shared example group 'td-agent::recieve' has been previously defined at:
/path/to/spec/_role/td-agent-recieve_spec.rb:3
...and you are now defining it at:
/path/to/spec/_role/td-agent-recieve_spec.rb:3
The new definition will overwrite the original one.