在测试过程中将 ENV 更改为 'production' 可能带来哪些不良后果?

What are the possible bad consequences of changing ENV to 'production' in the middle of a test?

我写了一段代码,只需要在生产环境中运行。在我的 spec/test 文件中,测试此代码时,我必须将 ENV 变量更改为 'production' 以便代码正常工作。

代码:

do_something if Rails.env.production?

规格:

context "some context" do

  before { Rails.env = 'production' }

  # test something

end

我的问题是:这个方法有问题吗?其他选项是在 'production' 或 'test' 环境中将代码更改为 运行。这是 "better" 在某种程度上吗?我觉得我不应该在测试过程中更改环境,但不知道这是否正确以及为什么。

不要在测试过程中改变环境,而是创建一个 ActiveSupport:StringInquirer(Rails.env 的 class)的实例并改为使用它:

 class MyClassThatNeedsEnvironment
     def initialize(env)
       @env = env
     end

     def foo
       do_something if @env.production?
     end
 end

测试示例:

    context "test" do

    let(:my_class_instance) {
        env_as_string = Rails.env.to_s    
MyClassThatNeedsEnvironment.new(ActiveSupport::StringInquirer.new(env_as_string))

    }

    end

    context "production" do
      let(:my_class_instance) {
        env_as_string = 'production'   

    MyClassThatNeedsEnvironment.new(ActiveSupport::StringInquirer.new(env_as_string))

    }
    end

这没有副作用并保留了依赖倒置。