おはようございます。
今日はRSpecを導入する方法をまとめていきたいと思います。
RSpec導入
まずはGemをインストールします。
group :development, :test do
gem 'rspec-rails', '~> 4.0.0'
end
次にターミナルで以下のコマンドを実行します。
$ bundle install
$ rails generate rspec:install
また、binstubと呼ばれるものをインストールすることでSpringの恩恵を受けアプリケーションの起動時間を素早くすることができるので、これをインストールします。上と一緒にインストールしてしまって大丈夫です。
group :develpment do
gem 'spring-commands-rspec'
end
$ bundle install
$ bundle exec spring binstub rspec
これにより、bin/rspecというコマンドでテストが実行できるようになりました。一つのテストを行うには起動時間が早いbin/rspecでいいのですが、テストをまとめて実施したいときはbundle exec rspecの方が早いらしいです。
これで、テストが実行することができるようになりました。
$ bin/rspec
RSpecを使う準備
次にジェネレーターで不要なファイルを生成しないように設定をしておきます。これにより、Minitestが生成されなくなります。また、特にMinitestを行わない場合はtestディレクトリを削除してしまって大丈夫です。
config.generators do |g|
g.test_framework :rspec,
view_specs: false,
helper_specs: false,
routing_specs: false
end
Model SpecやRequest Specを生成するコマンドは以下です。
$ bin/rails g rspec:model <モデル名>
$ bin/rails g rspec:request <モデル名>
また、次のようにヘルパーモジュールを作っておくと、リクエストスペックで返ってきたjsonを簡単に確認できるので便利です。supportディレクトリとファイルは自分で作成します。
module RequestHelpers
def json
JSON.parse(response.body)
end
end
このモジュールを使うためには、以下のような設定が必要です。
Dir[Rails.root.join("spec", "support", "**", "*.rb")].sort.each {|f| require f } #コメントアウトを外す
RSpec.configure do |config|
# 略
config.include(RequestHelpers, :type => :request) #追記
end
これで、リクエストスペック内でjsonと書くと、JSON.parse(response.body)
の結果が返されます。レスポンスの確認をするのに毎回書くのは面倒なので、作っておくといいかと思います。
FactoryBotの導入
また、テストを行う際によく使われているのが、テストデータを簡単に作ることができるFactoryBotと呼ばれるGemです。
group :development, :test do
gem 'factory_bot_rails'
end
bundle install後、ファイルを生成するコマンドを実行します。
$ bin/rails g factory_bot:model <モデル名>
FactoryBotを完結に書くことができる設定をしておくと便利です。
RSpec.configure do |config|
# 以下を追加
# - FactoryBotのシンタックスを省略できるようにする
# - 例. FactoryBot.build(:user) → build(:user)
config.include FactoryBot::Syntax::Methods
end
FactoryBotの書き方を紹介すると、これはこれで一つの記事になるので割愛します。これで一通りRSpecを使う準備が整いました。
補足
最後に補足として、僕が出会ったエラーとその解決方法を載せておこうと思います。
テスト環境でMigrationがされてない
テスト環境でmigrationが未実行というエラーが出るケースがあります。そういう場合は、以下のコマンドを実施すると解決します。
$ bin/rails db:migrate RAILS_ENV=test
テスト実行時にFactoryがつくられない
テスト実行のときに下記エラーが出る場合があります。
KeyError:
Factory not registered: "<Factory名>"
そういうときは以下をrails_helper.rbに追記します。
config.before(:all) do
FactoryBot.reload
end
さいごに
今回はRSpecの導入方法を紹介しました。次回ではRSpecの書き方についてまとめようかと思っています。
ここまで読んでいただきありがとうございました。