Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在rspec中设置轨道环境_Ruby_Rspec - Fatal编程技术网

Ruby 在rspec中设置轨道环境

Ruby 在rspec中设置轨道环境,ruby,rspec,Ruby,Rspec,请考虑以下代码: classmymodel 验证my_验证,除非ENV[“RAILS_ENV”]=“test” 结束 我们有一个验证,它将对测试套件的大部分产生重大影响。我只希望它在prod中执行,而不是在运行测试套件时执行*。。。除了与此验证相关的实际测试 因此,在测试验证时,我需要将ENV[“RAILS\u ENV”]设置为其他值,然后进行测试。我在我的my_model_spec.rb-文件中尝试了这一点: 它“测试验证”是什么 环境[“RAILS_ENV”]=“开发” #测试验证。。 环

请考虑以下代码:

classmymodel
验证my_验证,除非ENV[“RAILS_ENV”]=“test”
结束
我们有一个验证,它将对测试套件的大部分产生重大影响。我只希望它在prod中执行,而不是在运行测试套件时执行*。。。除了与此验证相关的实际测试

因此,在测试验证时,我需要将
ENV[“RAILS\u ENV”]
设置为其他值,然后进行测试。我在我的
my_model_spec.rb
-文件中尝试了这一点:

它“测试验证”是什么
环境[“RAILS_ENV”]=“开发”
#测试验证。。
环境[“RAILS_ENV”]=“测试”
结束
这将在spec文件中设置变量,但在
my_model.rb
中进行检查时,
ENV[“RAILS_ENV”]
仍返回“test”

有没有办法在SPEC文件中实现
ENV[“RAILS\u ENV”]
的声明,并且在示例运行期间执行模型代码时仍然设置该声明


  • 是的,是的,请相信我,我们已经控制住了(…我想:D)。这是在维护窗口期间
强制性:

validate my_validation unless ENV["RAILS_ENV"] == "test" 
在99.9%的情况下,这确实不是一个好主意

我只是觉得我需要说清楚,以防未来的读者看到这篇文章并得到有趣的想法。。。(最好更新测试套件以保持有效,例如通过更改工厂。)

有没有办法在SPEC文件中实现
ENV[“RAILS\u ENV”]
的声明

是-您可以存根值:

allow(ENV).to receive(:[]).with('RAILS_ENV').and_return('development')
也有一些其他的方法可以考虑。

例如,为了运行这个测试,为什么不直接调用这个方法呢

record = MyModel.new # or using FactoryBot.build / whatever
record.my_validation
或者,您可以添加模型属性以强制运行验证:

class MyModel
  attr_accessor :run_my_validation
  validate my_validation if ENV["RAILS_ENV"] != "test" || run_my_validation
end

# and in the test:
record = MyModel.new # or using FactoryBot.build / whatever
record.run_my_validation = true
expect(record.valid?).to be_true

另一种方法,你可以考虑,从生产代码中删除Rails环境检查,将设置一个。同样,您可以将其插入规范:

class MyModel
  validate my_validation if Rails.configuration.run_my_model_validation
end

# and in the test:
allow(Rails.configuration).to receive(:run_my_model_validation).and_return(true)

上述方法的另一个好处是,您可以在开发模式下启用验证,而无需对应用程序进行任何代码更改。

您应该使用
validate my_validation,if:->{…}
–否则,在加载类时,条件只会被评估一次。很好的Tom Lord和@Stefan-你的答案组合在一起很有效!如果您的测试套件中有很大一部分在验证过程中失败了,您如何确保它能在生产中正常工作?这可能是更好的适应测试新的验证,而不是反过来。花了23分钟对不起,斯特凡,我不是说,作为冲洗,但我留时间为这一评论出现:D -我很感激你的关注,虽然我们会仔细考虑它。顺便说一句,你在下面的评论中是完全正确的!再次感谢您抽出时间回答。