hello-world
webエンジニアのメモ。とりあえずやってみる。

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

参考


Related #Rails

[rails]ELB使用時にヘルスチェック用のアクションを作成する

ELBにrailsアプリをぶら下げる場合、railsアプリが落ちたらELBから外れてもらいたいです。

[rails]carrierwaveで保存した画像のurlを取得する

carrierwave 0.10.0 で確認 imageカラムにcarrierwaveで保存した画像を保存している場合、デフォルトのままだとだとurlメソッドを実行してもpublic以下のパスのみで http://~ が設定されていません。