テスト実行前後に処理を挟む場合はbefore、afterを使用します。
それぞれ:suite、:context、:exampleを指定してテストのどの部分に処理を挟むかを指定します。
※RSpecのバージョンはRspec3を想定しています。
以下のファイルを使用して、before/afterの動きを確認します。
[spec/test1_spec.rb]
describe 'describe 1' do
context 'in context 1' do
it 'is hello' do
expect('hello').to eq('hello')
end
it 'is bye' do
expect('bye').to eq('bye')
end
end
context 'in context 2' do
it 'is hello' do
expect('hello').to eq('hello')
end
it 'is bye' do
expect('bye').to eq('bye')
end
end
end
$ rspec -fd spec/test1_spec.rb
describe 1 in context 1 is hello is bye in context 2 is hello is bye
before(:context)、after(:context)
記述されたgroup(describe、context)スコープ内の最初と最後に実行されます。
- before(:context) groupスコープの最初に実行されます。
- after(:context) groupスコープの最後に実行されます。
[spec/test1_spec.rb]を以下のように変更して実行します。
describe 'describe 1' do before(:context) do p 'describe 1 before(:context)' end after(:context) do p 'describe 1 after(:context)' end context 'in context 1' do before(:context) do p 'context 1 before(:context)' end after(:context) do p 'context 1 after(:context)' end it 'is hello' do expect('hello').to eq('hello') end it 'is bye' do expect('bye').to eq('bye') end end context 'in context 2' do it 'is hello' do expect('hello').to eq('hello') end it 'is bye' do expect('bye').to eq('bye') end end end
$ rspec -fd spec/test1_spec.rb
describe 1 "describe 1 before(:context)" in context 1 "context 1 before(:context)" is hello is bye "context 1 after(:context)" in context 2 is hello is bye "describe 1 after(:context)"
“describe 1″内部のbefore(:context)/after(:context)は”describe 1″の最初と最後に、”context 1″内部のbefore(:context)/after(:context)は”context 1″の最初と最後に実行されているのがわかります。
before(:example)、after(:example)
記述されたgroup(describe、context)スコープ内のすべてのexample(it)の前後に実行されます。
- before(:example) groupスコープ内のすべてのexample(it)の前に実行されます。
- after(:example) groupスコープ内のすべてのexample(it)の後に実行されます。
※groupが入れ子になっていた場合、その内部のexampleの前後でも実行される。
[spec/test1_spec.rb]を以下のように変更して実行します。
describe 'describe 1' do before(:example) do p 'describe 1 before(:example)' end after(:example) do p 'describe 1 after(:example)' end context 'in context 1' do before(:example) do p 'context 1 before(:example)' end after(:example) do p 'context 1 after(:example)' end it 'is hello' do expect('hello').to eq('hello') end it 'is bye' do expect('bye').to eq('bye') end end context 'in context 2' do it 'is hello' do expect('hello').to eq('hello') end it 'is bye' do expect('bye').to eq('bye') end end end
$ rspec -fd spec/test1_spec.rb
describe 1 in context 1 "describe 1 before(:example)" "context 1 before(:example)" "context 1 after(:example)" "describe 1 after(:example)" is hello "describe 1 before(:example)" "context 1 before(:example)" "context 1 after(:example)" "describe 1 after(:example)" is bye in context 2 "describe 1 before(:example)" "describe 1 after(:example)" is hello "describe 1 before(:example)" "describe 1 after(:example)" is bye
“describe 1″内部のbefore(:context)/after(:context)が”context 1″内のexample(it)前後でも実行されているのがわかります。
before(:suite)、after(:suite)
- before(:suite) テスト全体の最初に実行されます。
- after(:suite) テスト全体の最後に実行されます。
※テストファイルが複数あっても実行されるのは一度だけです。
:suiteは特定のgroupスコープに属するものではないのでRSpec.configureブロック内に記述します。
[spec/test1_spec.rb]の先頭に以下を追加します。
RSpec.configure do |config| config.before(:suite) do p 'before(:suite)' end config.after(:suite) do p 'after(:suite)' end end
複数ファイルでテストしたいので、以下のファイルも追加します。
[spec/test2_spec.rb]
describe 'describe 2' do
context 'in context 1' do
it 'is hello' do
expect('hello').to eq('hello')
end
it 'is bye' do
expect('bye').to eq('bye')
end
end
context 'in context 2' do
it 'is hello' do
expect('hello').to eq('hello')
end
it 'is bye' do
expect('bye').to eq('bye')
end
end
end
ファイルを指定せずに実行します。
$ rspec -fd spec
"before(:suite)" describe 1 in context 1 is hello is bye in context 2 is hello is bye describe 2 in context 1 is hello is bye in context 2 is hello is bye "after(:suite)"
:contextや:exampleもRSpec.configureブロック内に記入できます。
以下は全ての一番外側のgroupスコープ(describe、context)の最初と最後に実行されます。
RSpec.configure do |config|
config.before(:example) do
p 'before(:example)'
end
config.after(:example) do
p 'after(:example)'
end
end
以下はgroupスコープに関係なくすべてのexample(it)前後に実行されます。
RSpec.configure do |config|
config.before(:example) do
p 'before(:example)'
end
config.after(:example) do
p 'after(:example)'
end
end