[rails][rspec]特定のテスト時のみenvを変更したい場合


RSpecで特定のテスト時のみenvを変更したいということがあったのでやってみました。

例として以下のような抽選メソッド(Hoge.lot)があったとします。

class Hoge
  def self.lot(debug = false)
    debug = false if Rails.env.production? # 本番環境はdebugを無効に
    return true if debug == true
    [true, false].sample
  end
end

引数にdebugフラグを渡すと必ずtrueを返すようになりますが、本番環境ではdebug機能が有効にならないようにしたいです。

テスト実行時はRails.envはtest環境になるので、 debug = false if Rails.env.production? のテストができません。

特定のテスト時のみenvを変更する場合は以下のようにstubを使用してenvを変更します。

require 'rails_helper'

RSpec.describe Hoge, :type => :model do
  it 'debugフラグがあると必ずtrueになる' do
    expect(Hoge.lot(true)).to be true
  end

  it 'productionではdebugフラグは無効になる' do
    allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production")) # これでenvを変更

    expect(Hoge.lot(true)).to eq(true) | eq(false)
  end
end

これで特定のテスト時のみenvを変更してテストをすることができました。

参考