DockerによるRails環境でRSpecとfactory_botを導入する方法まとめ


 

こんにちは。Tomoyuki(@tomoyuki65)です。

モダンなWebアプリケーションの開発ではテスト駆動開発をするのが一般的であり、Ruby on Railsのテストフレームワークとしては主にRSpecが利用されています。

そこで今回は、以前に私が構築した開発環境(Docker+Nginx+Puma+Rails+PostgreSQL)に対して、RSpecおよび、RSpecで用いるテストデータの作成を楽にしてくれるgem「factory_bot」を導入する方法をまとめます。

 

関連記事👇

Docker+Nginx+Puma+Rails+PostgreSQLで開発環境構築方法まとめ

2022年5月29日

 



DockerによるRails環境でRSpecとfactory_botを導入する方法まとめ

今回は、以前に私が構築した開発環境(Docker+Nginx+Puma+Rails+PostgreSQL)の続きからの作業を想定するため、まず以下のコマンドを実行してDockerコンテナとネットワークを削除し、その後からRSpecとfactory_botを導入していきます。

Macのターミナルでのコマンド実行例1

$ docker-compose down

 

テストフレームワーク用のGemを追加

まずはGemfileにテストフレームワーク用のGemを追加するため、フォルダ「dnprp-app/src」の直下にあるGemfileを開き、グループ「group :development, :test do」内に下記コメント「# テストフレームワーク」以下に記載のgemを追加します。

dnprp-app/src/Gemfileの修正

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をインストールします。

Macのターミナルでのコマンド実行例2

$ docker-compose run --rm app rails g rspec:install

 

RSpecの表示オプションの設定を追加

次にRSpec実行時の表示に対するオプションを設定するため、フォルダ「dnprp-app/src/spec」直下にある設定ファイル「.rspec」を開き、オプション「–format documentation」を追記します。

dnprp-app/src/spec/.rspecの修正

--require spec_helper
--format documentation

※このオプションを追加することにより、テストコードのcontextとitの部分をRSpecの実行結果に段階的に表示してくれるようになります。

 

SpringでRSpecを実行できるようにする

次に先ほど追加した「gem “spring-commands-rspec”」のコマンドを実行してSpringでRSpecを実行できるようにします。

※Springはバックグラウンドでアプリを起動した状態にしておいてくれることで、色々なコマンドの実行が早くなる仕組みのこと。RSpecにも適用するには上記gemの追加と設定の変更が必要。

Macのターミナルでのコマンド実行例3

$ 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」に変更します。

dnprp-app/src/config/environments/test.rbの修正

~
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になっている

dnprp-app/src/config/application.rbの修正

~
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」は不要になるため、以下のコマンドを実行して削除します。

Macのターミナルでのコマンド実行例4

$ rm -rf src/test/

 

factory_bot用の設定を追加

次にfactory_bot用の設定を追加するため、フォルダ「dnprp-app/src/spec」直下にあるrails_helper.rbを開き、「RSpec.configure do |config|」内に下記コメント「# factory_bot用の設定」以下のコードを追加します。

dnprp-app/src/spec/rails_helper.rbの修正

~
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」を実行します。

Macのターミナルでのコマンド実行例5(docker-compose立ち上げ)

$ docker-compose build
$ docker-compose up -d
Macのターミナルでのコマンド実行例6(SpringでRSpecの実行)

$ docker-compose exec app bin/rspec

 

実行後、上記のように表示されればOKです。

 



最後に

今回はDockerによるRails環境でRSpecとfactory_botを導入する方法をまとめました。

実務ではテスト駆動開発をする必要が出てくると思うので、その練習のための環境構築でRailsにRSpecを導入したい方はぜひ参考にしてみて下さい。

 

各種SNSなど

各種SNSなど、チャンネル登録やフォローをしていただけると励みになるので、よければぜひお願いします!

 

The following two tabs change content below.

Tomoyuki

SEを5年経験後、全くの未経験ながら思い切ってブロガーに転身し、月間13万PVを達成。その後コロナの影響も受け、以前から興味があったWeb系エンジニアへのキャリアチェンジを決意。現在はWeb系エンジニアとして働きながら、プロゲーマーとしても活躍できるように活動中。








シェアはこちらから


【2024年】おすすめのゲーミングPC

モンハンワイルズの発売日とPC版(Steam版)の推薦スペックが公開されたので、おすすめのゲーミングPCをご紹介!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です