KonifarPod

RSpecで全テスト共通の前処理を書く

   

Pocket

RSpecで全テスト共通の前処理を書く場合、共通のshared_contextを作って呼び出すのが一般的です。

例えばログインの処理などは下記のように書いておいて

[/spec/spec_helper.rb]

shared_context 'when user is logged in', :logged_in => true do
  before :each do
    # ログインの処理
  end
end

[users_controller_spec.rb]

describe UsersController, :logged_in => true do
  # テスト
end

のように実装できて便利です。

 

便利なんですが、作ったcontextを書かなきゃいけないとちょっと困る場合があります。

例えばObserverを実装してUserをcreateしたら何らかの処理を行うようにした時、他のテストに影響がないようにすでにあるテストではObserverを切っておきたいといったケースです。わざわざ全てのテストにcontextを書くのも微妙です。

そういう時、下記のように書いておくと全テストで共通の前処理を記述することができます。

[/spec/spec_helper.rb]

RSpec.configure do |config|
  config.before do
    #オブザーバーを切る
    ActiveRecord::Base.observers.disable :all
  end
end

 

これで、全てのテストのbefore句の最初に記述した処理を流すことができます。そもそもうまくテストを設計していればこんなの書かなくてもいいのかもしれませんが、現場では往々にして苦渋の決断が必要なシーンがあると思うので必要な時に記述してみてはいかがでしょうか。

Pocket

 - Develop