Techioz Blog

Ruby で rspec を実行するときに環境変数を変更するにはどうすればよいですか?

概要

いくつかの Ruby スクリプトがあり、rspec でテストしています。

私は環境を (今のところ) env.rb ファイルに入れて、ローカルでアクセスできるようにし、本番環境では設定変数に入れられるようにしています。

しかし、rspec を実行するときは、別の環境変数が必要になります。 2 つの使用例:

解決策

あなたはできる

私は個人的に、オブジェクトを作成し、その環境変数値をコンストラクターに渡すときにのみ ENV 変数を使用することを好みます。これにより、ENV を気にせずにオブジェクト クラスをテストでき、他のオブジェクトを環境変数で初期化するオブジェクトをテストできます。環境変数を使用して作成をアサートするだけです。

したがって、次のように変更します

class Client
  def initialize
    @restclient = RestClient::Resource.new(ENV["API_URL"])
  end
end

class Client
  def initialize(url)
    @restclient = RestClient::Resource.new(url)
  end
end

そして、そのインスタンスを初期化しているものを何でも持ってから、環境変数の値を渡します

def fetch_content
  client = Client.new(ENV["API_URL"])
  # ...
end

この方法では、環境変数を気にせずに URL を渡すだけで Client クラスをテストでき、クライアントをインスタンス化するクラスを次のようにテストできます。

it "uses client" do
  ENV["API_URL"] = "foo.com"
  expect(Client).to receive(:new).with(ENV["API_URL"])  
  subject.fetch_content
end

環境変数の更新に関する 1 つの問題は、変更がテスト スイートの残りの部分全体にわたって持続し、一部のテストでその変更が存在すると予想していない場合に問題が発生する可能性があることです。このような場合は、次のように値をモックできます。

expect(ENV).to receive(:[]).with("API_URL").and_return("foo.com")