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 が落ちるような動作はしないように見える。