71
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rspecのbefore(:all)の注意点

Last updated at Posted at 2015-03-05

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)を使う際には気を付けましょうというお話でした。

参考

71
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?