Skip to content

Instantly share code, notes, and snippets.

@kozy4324
Last active December 19, 2015 19:29
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kozy4324/6006503 to your computer and use it in GitHub Desktop.
Save kozy4324/6006503 to your computer and use it in GitHub Desktop.
serverspecをshared_examplesを使ってRole毎のspecを分けてみる

serverspecをshared_examplesを使ってRole毎のspecを分けてみる

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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment