Ruby on Rails

【Ralis】RSpec導入手順

おはようございます。
今日は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の書き方についてまとめようかと思っています。
ここまで読んでいただきありがとうございました。

ABOUT ME
sakai
東京在住の30歳。元々は車部品メーカーで働いていてましたが、プログラミングに興味を持ちスクールに通ってエンジニアになりました。 そこからベンチャー → メガベンチャー → 個人事業主になりました。 最近は生成 AI 関連の業務を中心にやっています。 ヒカルチャンネル(Youtube)とワンピースが大好きです!