Just do IT

思うは招く

Rails に RSpec と FactoryBot を導入する手順

環境

$ rails -v
Rails 6.0.3.2

$ ruby -v
ruby 2.7.1

手順

gem インストール

RSpec と FactoryBot をインストール。

group :development, :test do
  gem "factory_bot_rails"
  gem "rspec-rails"
end
  • なぜ開発とテスト環境に記述するのか?
    • 関連ファイルを生成するときにgeneratorを使うため
  • なぜfactory_botではなくfactory_bot_railsなのか?
    • factory_bot_railsRailsでFactoryBotを使うためのgem
    • factory_botRails以外でFactoryBotを使うためのgem

インストールする。

$ bundle install

RSpec 導入

RSpecを導入する。

$ bin/rails generate rspec:install

testディレクトリを削除。

$ rm -r ./test

application.rb

テストフレームワークRSpecに設定。

class Application < Rails::Application
    config.generators do |g|
      g.test_framework :rspec
    end
  end

これを設定しないとminitestのテストファイルが生成され続けてしまう。

自動生成するファイルの種類も設定できる。

    config.generators do |g|
      g.test_framework :rspec,
        fixtures: false,
        view_specs: false,
        helper_specs: false,
        routing_specs: false
    end

spec_helper.rb

  • "capybara/rspec"をrequire
  • ブラウザにはヘッドレスChromeを設定
require "capybara/rspec"

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium_chrome_headless
  end
~

rails_helper.rb

以下の記述を加えることで、FactoryBot.~の文字を省略することができる。これはお好みで。

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

次に、初期設定でコメントアウトされてる以下の部分をコメントイン。

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

これでsupportディレクトリ下に設置したヘルパーを使い回せる。登録したスタブを呼び出すときなどいろいろ。

スペックファイルの生成

#システムスペック(システムテスト)
$ bin/rails g rspec:system ファイル名

#モデルスペック(モデルテスト)
$ bin/rails g rspec:model ファイル名

rspecの実行

$ bundle expec rspec

-fdオプションをつけると仕様記述が表示される。

$ bundle expec -fd rspec

システムスペックには何を書けばいいか

E2Eテストなので、ユーザーの行動に沿ったテストを書く。その際はCRUDを意識する。

たとえばタスク管理機能の部分をテストしたいなら、

  • Create: タスクを作成できるか
  • Read: タスクが表示できるか(一覧ページや詳細ページ等)
  • Update: タスクが編集できるか
  • Delete: タスクを削除できるか

となる。

参考

RSpecを学ぶのにオススメの記事

RSpecの使い方を手っ取り早く、正確に知るには以下の記事シリーズがすばらしい。

RSpec で TDD を体験できる記事シリーズ。