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