5
1

More than 1 year has passed since last update.

Rspec+FactoryBot導入メモ

Last updated at Posted at 2022-03-04

gemのインストール

下記のgemを追加して bundle install を実行する。

Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  # 以下必要に応じて追加する
  # 必要になったタイミングで追加で問題なし
  # gem 'faker' 名前やリージョンなど様々なダミーデータが使用できる
  # gem 'rubocop-rspec' rspecでrubocopを使用できる
  # gem 'rspec_junit_formatter' circleCIなどのCIツールで並列テストを効率的に実行するためのタイミングデータを作成してくれる
end

注) factory_bot_railsをdevelopmentのgroupに含めないと、テスト実行時に下記エラーが発生する

shell
An error occurred while loading ./spec/models/hoge_spec.rb.
Failure/Error: config.include FactoryBot::Syntax::Methods

Rspec初期化

下記コマンドを実行。

shell
$ rails g rspec:install
      create .rspec
      create spec
      create spec/spec_helper.rb
      create spec/rails_helper.rb

Rspecの実行テストを行う。

shell
$ rspec
No examples found.

Finished in 0.00177 seconds (files took 0.47683 seconds to load)
0 examples, 0 failures

Rspecの設定

RAILS_ENVについて

puma.rbなどでRAILS_ENVが初期化されてしまっている場合spec_helperを修正する必要があるので、必要に応じて下記の箇所を修正する。

spec_helper.rb
ENV['RAILS_ENV'] ||= 'test' # 必要に応じて ||= を = に変更する

結果出力設定

Rspec実行時に -f documentation オプションを付与すると出力結果が整形されて見やすくなる。
spec_helperの下記部分のコメントアウトを外し、実行ファイルが一つの場合自動でdocumentationオプションが付与されるようにするのがオヌヌメ。

spec_helper.rb
  if config.files_to_run.one?
    # Use the documentation formatter for detailed output,
    # unless a formatter has already been configured
    # (e.g. via a command-line flag).
    config.default_formatter = "doc"
  end

DBの設定

(未作成の場合)テスト用のDBを作成する。
config/database.ymlのtest環境を正しく設定した後、コマンドを実行する。

database.yml
  default: &default
    ... # 略

  test:
    <<: *default
    database: test_application
shell
$ rake db:create
$ rake db:migrate RAILS_ENV=test

FactoryBotの設定

Factory_botのメソッドを使用する際、クラス名を省略できるように
rails_helper.rbに設定を追記する。

rails_helper.rb
Rspec.configure do |config|
  ...

  # 下記設定の追加
  config.include FactoryBot::Syntax::Methods
end

spec_helper.rb と rails_helper.rb の違い

spec_helper.rb
railsに紐づかないテストを実行する際にも適用される。
rails_helper.rb
railsに紐づくテストのみに適用される。

railsに紐づかないテストを書くことが基本的にないのでrails_helper.rbに追記する方針でおk。

FactoryBotのファイル生成・設定

ファイル生成

shell
$ rails g factory_bot:model user
      create  spec/factories/users.rb

設定

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "NAME_#{n}" }
    age { 10 }
    gender { User.genders.values.first }

    trait :man do
      gender { User.genders[:man] }
    end

    trait :woman do
      gender { User.genders[:woman] }
    end
  end
end

テストファイルの作成・設定

ファイル生成

shell
$ rails g rspec:model user
      create  spec/models/user_spec.rb

設定

spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  let!(:user) { create(:user, name: "taro") }

  describe "User#change_name" do
    context "12文字以下の場合" do
      let!(:after_name) { "ObiWanKenobi" }
      it "正しくnameが変更される" do
        user.change_name(after_name)
        expect(user.name).to eq after_name
      end
    end
  end

end

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1