Techioz Blog

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)