[rails/rails] rbenv/rvm環境でのRubyバージョン管理テストの信頼性向上
問題の背景
Railsのジェネレータには、.ruby-versionファイルに書き込むRubyバージョン文字列を決定するversion_manager_ruby_versionメソッドが存在します。#56365でこの機能に対するテストが追加されましたが、rbenvやrvmといったRubyバージョン管理ツールを使用している開発環境では、これらのテストが失敗する問題が発覚しました。
具体的には、以下のように期待値と実際の値が一致しないテスト失敗が発生していました:
Failure:
Rails::Generators::GeneratorTest#test_version_manager_ruby_version_with_mri_ruby [test/generators/generator_test.rb:70]:
Expected: "ruby-3.4.0"
Actual: "4.1.0"
この問題は、テスト環境においてrbenvやrvmが設定する環境変数(RBENV_VERSIONやrvm_ruby_string)が実際に存在しており、テストコードがこれらの環境変数を適切に制御できていなかったことに起因します。
技術的な変更内容
本PRでは、各テストケース内で環境変数を明示的にnilに設定することで、テスト実行環境におけるバージョン管理ツールの影響を排除する対策を実装しました。
変更前の問題のあるコード
def test_version_manager_ruby_version_with_mri_ruby
klass = make_builder_class
generator = klass.start(["new", "blah"])
stub_const(Object, :RUBY_ENGINE, "ruby") do
Gem.stub(:ruby_version, Gem::Version.new("3.4.0")) do
assert_equal "ruby-3.4.0", generator.send(:version_manager_ruby_version)
end
end
end
このコードは、RUBY_ENGINEとGem.ruby_versionをスタブ化してテスト対象のメソッドの挙動を検証していますが、RBENV_VERSIONやrvm_ruby_stringといった環境変数の影響を考慮していませんでした。
変更後の改善されたコード
def test_version_manager_ruby_version_with_mri_ruby
klass = make_builder_class
generator = klass.start(["new", "blah"])
switch_env "RBENV_VERSION", nil do
switch_env "rvm_ruby_string", nil do
stub_const(Object, :RUBY_ENGINE, "ruby") do
Gem.stub(:ruby_version, Gem::Version.new("3.4.0")) do
assert_equal "ruby-3.4.0", generator.send(:version_manager_ruby_version)
end
end
end
end
end
switch_envヘルパーメソッドを使用して、RBENV_VERSIONとrvm_ruby_stringをnilに設定することで、テスト実行時にこれらの環境変数が存在しない状態を再現します。これにより、スタブ化したRuby定数とGemバージョンのみを使用したテスト検証が可能になります。
修正されたテストケース
本PRでは、以下の4つのテストケースに対して同様の修正が適用されました:
-
test_version_manager_ruby_version_with_rvm_env_var: RVM環境変数が設定されている場合のテスト-
RBENV_VERSIONをnilに設定することで、rbenv環境の影響を排除
-
-
test_version_manager_ruby_version_with_mri_ruby: 標準MRI Rubyでのバージョン検出テスト-
RBENV_VERSIONとrvm_ruby_stringの両方をnilに設定
-
-
test_version_manager_ruby_version_with_mri_ruby_prerelease: プレリリース版MRI Rubyのテスト- 同様に両環境変数を
nilに設定
- 同様に両環境変数を
-
test_version_manager_ruby_version_with_non_mri_ruby: JRubyなど非MRI実装のテスト- 両環境変数を
nilに設定することで、Ruby実装の検出ロジックを正確にテスト
- 両環境変数を
技術的な意義
この修正により、テストの実行環境に依存しない信頼性の高いテストスイートが実現されました。開発者がrbenvやrvmを使用しているかどうかに関わらず、一貫したテスト結果が得られるようになり、CIパイプラインとローカル開発環境の両方で同じ品質保証が可能になります。
特に、Railsのようなフレームワークにおいて、ジェネレータが生成する.ruby-versionファイルの内容は、プロジェクトのRuby環境設定の基礎となる重要な要素です。このテストの信頼性向上は、新規プロジェクト作成時の環境設定の正確性を保証する上で不可欠な改善と言えます。