在测试过程中将 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
这没有副作用并保留了依赖倒置。
我写了一段代码,只需要在生产环境中运行。在我的 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
这没有副作用并保留了依赖倒置。