2014-12-22 19 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

相關問題