こんにちは。Tomoyuki(@tomoyuki65)です。
モダンなWebアプリケーションの開発ではテスト駆動開発をするのが一般的であり、Ruby on Railsのテストフレームワークとしては主にRSpecが利用されています。
そこで今回は、以前に私が構築した開発環境(Docker+Nginx+Puma+Rails+PostgreSQL)に対して、RSpecおよび、RSpecで用いるテストデータの作成を楽にしてくれるgem「factory_bot」を導入する方法をまとめます。
関連記事👇
目次
DockerによるRails環境でRSpecとfactory_botを導入する方法まとめ
今回は、以前に私が構築した開発環境(Docker+Nginx+Puma+Rails+PostgreSQL)の続きからの作業を想定するため、まず以下のコマンドを実行してDockerコンテナとネットワークを削除し、その後からRSpecとfactory_botを導入していきます。
$ docker-compose down
テストフレームワーク用のGemを追加
まずはGemfileにテストフレームワーク用のGemを追加するため、フォルダ「dnprp-app/src」の直下にあるGemfileを開き、グループ「group :development, :test do」内に下記コメント「# テストフレームワーク」以下に記載のgemを追加します。
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem "debug", platforms: %i[ mri mingw x64_mingw ]
# テストフレームワーク
gem "rspec-rails"
gem "spring-commands-rspec"
gem "factory_bot_rails"
end
RSpecのインストール
gemを追加後、以下のコマンドを実行してRailsにRSpecをインストールします。
$ docker-compose run --rm app rails g rspec:install
RSpecの表示オプションの設定を追加
次にRSpec実行時の表示に対するオプションを設定するため、フォルダ「dnprp-app/src/spec」直下にある設定ファイル「.rspec」を開き、オプション「–format documentation」を追記します。
--require spec_helper
--format documentation
※このオプションを追加することにより、テストコードのcontextとitの部分をRSpecの実行結果に段階的に表示してくれるようになります。
SpringでRSpecを実行できるようにする
次に先ほど追加した「gem “spring-commands-rspec”」のコマンドを実行してSpringでRSpecを実行できるようにします。
※Springはバックグラウンドでアプリを起動した状態にしておいてくれることで、色々なコマンドの実行が早くなる仕組みのこと。RSpecにも適用するには上記gemの追加と設定の変更が必要。
$ docker-compose run --rm app bundle exec spring binstub rspec
そして、フォルダ「dnprp-app/src/config/environments」直下にある「test.rb」を開き、「Rails.application.configure do」内にある「config.cash_classes」の値を「false」に変更します。
~ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Turn false under Spring and add config.action_view.cache_template_loading = true. # bin/rspec実行のためにfalseに変更 #config.cache_classes = true config.cache_classes = false ~
※config.cache_classesがtrueならキャッシュを使用する(リクエストごとにアプリケーションのクラスやモジュールをreloadしない)設定になっている。ただし、falseにしないとSpringでRSpecを実行できない。
テストフレームワークをRSpecに変更
次にテストフレームワークをRSpecに変更するため、フォルダ「dnprp-app/src/config」の直下にあるapplication.rbを開き、moduleにあるクラス内に下記コメント「# テストフレームワークをRSpecに設定」以下のコードを追加します。
※RailsでデフォルトのテストフレームワークはMinitestになっている
~ module DnprpApp class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 7.0 # Configuration for the application, engines, and railties goes here. # # These settings can be overridden in specific environments using the files # in config/environments, which are processed later. # # config.time_zone = "Central Time (US & Canada)" # config.eager_load_paths << Rails.root.join("extras") # テストフレームワークをRSpecに設定 config.generators do |g| g.test_framework :rspec, fixtures: false, view_specs: false, helper_specs: false, routing_specs: false end end ~
※fixtures、view_specs、helper_specs、routing_specsの設定(true or false)によって自動生成するファイルの種類も設定可能
そして、フォルダ「dnprp-app/src」直下にあるMinitest用のフォルダ「test」は不要になるため、以下のコマンドを実行して削除します。
$ rm -rf src/test/
factory_bot用の設定を追加
次にfactory_bot用の設定を追加するため、フォルダ「dnprp-app/src/spec」直下にあるrails_helper.rbを開き、「RSpec.configure do |config|」内に下記コメント「# factory_bot用の設定」以下のコードを追加します。
~ RSpec.configure do |config| # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.fixture_path = "#{::Rails.root}/spec/fixtures" # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false # instead of true. config.use_transactional_fixtures = true # You can uncomment this line to turn off ActiveRecord support entirely. # config.use_active_record = false # RSpec Rails can automatically mix in different behaviours to your tests # based on their file location, for example enabling you to call `get` and # `post` in specs under `spec/controllers`. # # You can disable this behaviour by removing the line below, and instead # explicitly tag your specs with their type, e.g.: # # RSpec.describe UsersController, type: :controller do # # ... # end # # The different available types are documented in the features, such as in # https://relishapp.com/rspec/rspec-rails/docs config.infer_spec_type_from_file_location! # Filter lines from Rails gems in backtraces. config.filter_rails_from_backtrace! # arbitrary gems may also be filtered via: # config.filter_gems_from_backtrace("gem name") # factory_bot用の設定 config.include FactoryBot::Syntax::Methods end
ここまででRSpecとfactory_botを導入するための修正は完了です。
docker-composeを立ち上げ後、RSpecを実行する
最後にSpringでRSpecを実行できるかを確認するため、docker-composeを立ち上げた後に「bin/rspec」を実行します。
$ docker-compose build
$ docker-compose up -d
$ docker-compose exec app bin/rspec
実行後、上記のように表示されればOKです。
最後に
今回はDockerによるRails環境でRSpecとfactory_botを導入する方法をまとめました。
実務ではテスト駆動開発をする必要が出てくると思うので、その練習のための環境構築でRailsにRSpecを導入したい方はぜひ参考にしてみて下さい。
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- 【スト6】モダンキャミィの初心者向けコンボまとめ【STREET FIGHTER 6(ストリートファイター6)】 - 2024年11月10日
- モンハンワイルズでおすすめのオプション設定まとめ【Monster Hunter Wilds】 - 2024年11月4日
- モンハンワイルズでおすすめのグラフィック設定まとめ【Monster Hunter Wilds】 - 2024年11月2日
コメントを残す