RSpec で ENV を stub (mock) したくなったら Settings を使うべき

Published: 2023/5/2


RSpec でテストを書いていると、環境変数によって変わる振舞いであったり、動作のための必須設定としての環境変数であったりを、 mock ないし stub したくなっていく。

ネットで検索すると、 ENV[] メソッドであったり fetch メソッドだったりをスタブすると良い、という記事がたくさんヒットするが、おそらくそれは正しくないので、それに関する備忘録。

mock の問題点: []fetch の表記揺れなど

ruby において、 Hash からデータを呼び出そうとした場合に、

  • hash[:key] でアクセス
  • hash.fetch(:key) でアクセス
  • hash.to_h[:key] でアクセス

など、最終的な結果は同じとなるが、利用するメソッドには自由度がある。

一方で RSpec の mock は、 mock したいオブジェクトとそのメソッドを明示的に指定する必要があり、結果が同じであれば良い、という条件を表現することが、少なくとも Hash を真似ているインターフェイスを持つ ENV オブジェクトに対しては、基本的に難しい、ということになる。

正しい対応方法: Settings を利用する

railsconfig/config の gem を利用すると、 settings.yml を環境毎に定義して、その値に従って Settings.group.config_name などから、その値を取得できる。 また、 この settings.yml は ERB 形式で記述できるため、中に任意の ruby 式を記述でき、そこで環境変数(ENV)を取得することもできる。

これを利用することで、テスト用の設定値を config/settings/test.yml に書き出し、アプリケーションコード中では Settings.xxx.yyy から設定値を読み込むようにすることで、 ENV を直でアクセス・モックしなければならない、という構造を撲滅できる。

参考


Tags: rspec

関連記事