Satya's blog - Stubbing the Rails environment for rspec
|
From http://blog.thefrontiergroup.com.au/2011/06/stubbing-out-rails-env/ To stub the rails environment for rspec-based testing, you can add this function to spec_helper.rb:
def stub_env(new_env, &block)
original_env = Rails.env
Rails.instance_variable_set("@_env", ActiveSupport::StringInquirer.new(new_env))
block.call
ensure
Rails.instance_variable_set("@_env", ActiveSupport::StringInquirer.new(original_env))
end
And use it like this:
it "should have the correct default options" do
stub_env('development') {
# Rails.env.development? is now true
# Do some thing here
}
end
So stub_env gets called with what the environment should be. It saves the original environment and restores it later in the ensure block (to avoid test pollution -- other tests should not see the fake environment). It sets the requested environment and calls the block that was given to it. The key here is that Rails.env accesses an instance variable on the Rails object and that instance variable is @_env. ActiveSupport.StringInquirer is what that instance variable is supposed to contain. It's what allows us to do Rails.env.development? instead of Rails.env == 'development'. A ridiculous thing to do, in my opinion. |
|