はじめに
FactoryBotの挙動を確認するために$ rails cでコンソールを起動しFactoryBot.create(:user)等のコマンドを実行してもテスト用のDBに追加されなかった。
調べると、consoleコマンドにはいくつかオプションがありそこで環境を指定できることを知った。ただ実際に環境を指定してコンソールを起動したところエラーが発生したため本記事では環境の指定方法と詰まったポイント・解決方法を記録する。
構成
1. 環境の指定してコンソールを起動する方法
2. 詰まったポイント・解決方法
実行環境
Ruby 3.0.3
Rails 6.1.4
rspec-rails 5.0.2
factory_bot_rails 6.2.0
1. 環境を指定してコンソールを起動する方法
consoleコマンド
-
consoleコマンド(cと省略可能)でコンソールを起動することでRailsアプリケーションとやり取りすることが可能。
$ rails c
Running via Spring preloader in process 261
Loading development environment (Rails 6.1.4.1)
irb(main):001:0>
- モデルを介してデータをDBに保存したり、定義したメソッドの挙動の確認したりする際に使用される。
irb(main):001:0> Article.create(title: "タイトル1", content: "内容1")
- 内部にirbが組み込まれているため、Rubyのコードを実行することが可能。
- Railsアプリケーションの環境を読み込んだ上でコードを実行することが可能
環境を指定する
Railsには以下3つの環境が用意されている
- develop: 開発環境
- test: テスト環境
- production: 本番環境
Rails5までは$ rails c [環境]で環境を指定することで対象環境でコンソールを起動することができる。
# テスト環境でコンソールを起動する場合
$ rails c test
# 本番環境でコンソールを起動する場合
$ rails c production
Rails6以降では上記の方法だとエラーが発生するため以下いずれかの方法で起動する
RAILS_ENV=[環境] rails crails c --environment [環境]rails c -e [環境]
# テスト環境でコンソールを起動する場合
$ rails c -e test
デフォルトでは開発環境が指定されている
デフォルトでは開発環境に設定されているため何も指定せずに起動した場合は開発環境でコンソールが起動する.
$ rails c
Running via Spring preloader in process 71
Loading development environment (Rails 6.1.4.1)
irb(main):001:0> Rails.env
=> "development"
2. 詰まったポイント・解決方法
test環境でコンソールを起動したいため、以下コマンドを実行すると,エラーが発生した。
$ rails c -e test
/usr/local/bundle/gems/spring-3.1.1/lib/spring/application.rb:101:in `block in preload': Spring reloads, and therefore needs the application to have reloading enabled.
Please, set config.cache_classes to false in config/environments/test.rb.
1. メッセージを見てみる
「springはreloadを行うので、アプリケーション側でreloadを有効にする必要がある。」
「config/environments/test.rbに記載されているconfig.cache_classesをfalseに設定してください」
2. springとは何だ
gemの一つで、Railsアプリケーションをバックグラウンドで起動させたままにしておく事でrailsコマンドを実行する度にRailsを起動しないで済むため開発の効率向上を実現できる。
3. config/environments/test.rbのconfig.cache_classesを見てみる
Rails.application.configure do
...
config.cache_classes = true
...
end
現状では、なぜだかtrueとなっており、キャッシュを使用する(リクエストごとにアプリケーションのクラスやモジュールをreloadしない)設定になっている。
※ Rails6以降のconfig.cache_classesのデフォルト値は以下のとおり
(参考: https://madogiwa0124.hatenablog.com/entry/2019/09/16/145657)
-
development:
false -
test: springがインストール済み ->
false, 未インストール ->true -
production:
true
4. falseに変更し、再度実行してみる
Rails.application.configure do
...
config.cache_classes = false
...
end
$ rails c -e test
Running via Spring preloader in process 246
Loading test environment (Rails 6.1.4.1)
irb(main):001:0> FactoryBot.create(:user)
TRANSACTION (2.0ms) BEGIN
...
test環境でコンソールが起動されて、FactoryBot.create(:user)を実行することでテスト用のDBに正しくファクトリが保存された。
参考