2014-12-22 12 views
1

我有一个模型,根据他们正在运行的环境(低谷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文件之前刷新环境?

回答

0

在简单的话:

我可以想象,一旦你完全运行测试,这些文件是必需的,验证定义一次

因此,即使在测试中更改ENV['NETWORK']的值后,presence密钥的值仍保持不变。

使用每次对对象进行验证时都读取环境变量的验证方法。

这里是你共享样本代码的示例:

validate :validator_name 

def validator_name 
    if (ENV['NETWORK'] != 'testnet3') && output_address.blank? 
    # add errors here 
    end 
end 
+0

似乎是一个很好的选择。我会试试看。 – Rojo

+0

如果有效,请将我的回答标记为答案。 – Humza

+0

这种方法很好地保存了ENV并且还使用了climate_control。 – Rojo

相关问题