我有一个模型,根据他们正在运行的环境(低谷ENV变量)动态定义一些验证。有没有办法在RSpec模型中测试环境定义的动态验证?
例如,我使用ENV['NETWORK']
变量设置为'testnet3'
网络进行开发和测试,并设置为'bitcoin'
网络进行生产。那么,让我们说我有一个具有动态设置验证称为Transaction
模型如下:
Transaction < ActiveRecord::Base
validates :output_address,
presence: output_address_presence_requirement_for ENV['NETWORK']
end
# somewhere exists the 'output_address_presence_requirement_for' function
def output_address_presence_requirement_for(network)
if network == 'testnet3'
false
else
true
end
end
然后,我有两套规格的:一个是模型的行为用“比特币”的网络时(生产),一个用于使用'testnet3'网络(开发/测试)时的行为。当它们自己运行每个文件时,它们按预期工作,但当运行一个接一个时,如rspec spec/models
,更改ENV变量的值似乎没有效果,第二组规格失败。
我试过使用climate_control
,调用ENV的存根,甚至直接设置ENV变量的值,在每种情况下都有相同的结果:如果单独运行测试通过,第二组测试失败,如果运行他们作为一个整体。
似乎RSpec在运行一组测试时重用相同的Rails环境,并且在调用第一组测试时定义模型验证,但在调用第二组测试时不会重新定义模型验证。
我可以使用不同的验证模型来存储信息取决于使用的网络,但我想避免它,因为它需要一个更复杂的逻辑控制器和更多的规格。
是否有一些可以在RSpec端完成,使其在运行spec文件之前刷新环境?
似乎是一个很好的选择。我会试试看。 – Rojo
如果有效,请将我的回答标记为答案。 – Humza
这种方法很好地保存了ENV并且还使用了climate_control。 – Rojo