rspec テスト時に環境ソースの定数を処理する最善の方法は何ですか?
概要
次のような定数を持つモデルがあります。
SOURCE_QUOTA = {
'free' => (ENV['FREE_SOURCE_QUOTA'] || '5').to_i,
'premium' => (ENV['PREMIUM_SOURCE_QUOTA'] || '100').to_i
}.freeze
RuboCop は、「Style/MutableConstant」を提案し、フリーズはそこにあるはずだと提案します。
ただし、コード内で変更すると作業が楽になります。例えば:ただし、テスト中は少し異なる値を使用したいと考えています。これで、rspec を起動する bash セッションの ENV を実際に変更できるようになりました。もちろん。
describe "a thing" do
it "does stuff" do
ENV['FREE_SOURCE_QUOTA'] = '2'
DataSource::SOURCE_QUOTA["free"] = ENV['FREE_SOURCE_QUOTA'].to_i
# test code
上記は定数が固定されていない場合に機能します。これは、フリーズすると、Rails 環境の読み込み中にモデルが読み込まれ、この値をミュートできない (フリーズしている) ためだと思います。
ここで何をするのが最善でしょうか?
ありがとう!
解決策
次のように、定数の代わりにクラスメソッドを使用することを考えます。
# in your model
def self.source_quota
{
'free' => (ENV['FREE_SOURCE_QUOTA'] || '5').to_i,
'premium' => (ENV['PREMIUM_SOURCE_QUOTA'] || '100').to_i
}
end
次に、テストでそのメソッドを次のようにモックします。
allow(DataSource).to receive(source_quota)and_return('free' => 2)