[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を変更してテストをすることができました。