我有一個模型,根據他們正在運行的環境(低谷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