rspecでbefore(:all)使うときには気を付けようねというお話。
before(:all)とbefore(:each)の違い
- before(:all)はcontext/describe ブロックが始まる時に一度だけ実行される
- before(:each)は各スペック内のitの前に実行される
before(:all)の注意点
通常、各スペックは独立してテストしたい。
でも、before(:all)を使うとそれができなくなる。
describe User, 'something' do
before :all do
@user = User.make
end
it 'should so something' do
# ...
end
it 'should so something else' do
# ...
end
end
例えば上記の例の場合、@userは一度しか作られない。なのでそのレコードに対して一度変更を加えると、次のテストでもその変更が引き継がれ、独立したテストができなくなる。
加えて、before(:all)で作成されたデータは、テストが終わった後もロールバックされず、データベースに残ってしまう。なので、before(:all)でデータを作成した後は、after(:all)でデータベースをきれいにする必要がある。
before(:each)を使おう
というわけで、データを作成する際にはbefore(:all)は使わないほうが無難。
基本的にはbefore(:each)を使う。
それが難しい場合には、Database Cleanerを用いる。
after(:all) do
DatabaseCleaner.clean_with(:truncation)
end
以上、before(:all)を使う際には気を付けましょうというお話でした。