Rails.envは全体に影響するけど、RSpec書いてて忘れちゃった話

[2011-11-20 追記] stub を使えば戻し忘れの問題はないみたい。こんでいいのかな?

Rails 3.0.10 + RSpec 2.6.0 のお話。

すごく当たり前なんだけど、RSpec の block で区切れる書き方を見慣れてたら忘れてしまっていたこと。

Rails.env 変更したら spec の実行全体に影響します。

そらそうだ。

ダメな例

具体的には

module FooHelper
  def bar
    if ( Rails.env.production? )
      ...
    end
  end
end

こんな感じのヘルパーメソッドをテストするために

desribe FooHelper do
  context 'production' do
    before {
      Rails.env = 'production'
    }
    it {
      bar.should == baz
    }
  end
  context 'development' do
    before {
      Rails.env = 'development'
    }
    it {
      bar.should == qux
    }
  end
end

なんてことをしてたんだけど、他のspecが落ちちゃう。なんでかなーと悩んでたんだけど、何のことはない。

 after(:all) {
   Rails.env = 'test'
 }

で戻しておきましょうっていうだけだった。

もう一度。

そらそうだ。

stub にするのが正解かな?

stub にすれば block 内だけ変更されるみたい。自分の場合は RR を使っているので

stub(Rails.env).production? { true }

とすれば本番環境用の動作に切り替えることができる。これであれば RSpec の作る block 内でだけ影響するみたい。少なくとも戻し忘れて他の spec が落ちるような動作はしないように見える。

More