RSpec で ENV を stub (mock) したくなったら Settings を使うべき
Published: 2023/5/2
RSpec でテストを書いていると、環境変数によって変わる振舞いであったり、動作のための必須設定としての環境変数であったりを、 mock ないし stub したくなっていく。
ネットで検索すると、 ENV
の []
メソッドであったり fetch
メソッドだったりをスタブすると良い、という記事がたくさんヒットするが、おそらくそれは正しくないので、それに関する備忘録。
[]
と fetch
の表記揺れなど
mock の問題点: 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
関連記事
RSpec の mock の際に、任意のコードを実行する
2023/6/3
RSpec での metadata の活用法についての覚書
2020/1/27