RSpec を始めるときの手順
RSpec の gem を入れます
$ vim Gemfile
group :development, :test do
gem 'rspec-rails', '~> 3.8'
endbundle install して初期設定
$ bundle install
$ rails generate rspec:install$ vim .rspec
--require spec_helper
--format documentationformat = documentation のほうが見やすいです

デフォルト

spring-commands-rspec gem を入れます
$ vim Gemfile
group :development, :test do
gem 'spring-commands-rspec', '~> 1.0.4'
endインストール
bundle installbin/rspec で呼べるようにする
すでに bin/rspec が存在してたら消してから
bundle exec spring binstub rspecこれで bin/rspec で呼べます
User model
RSpec.describe User, type: :model do
it 'is valid with email, name, password' do
user = User.new(
email: '[email protected]',
name: 'foobar',
password: 'password',
password_confirmation: 'password'
)
expect(user).to be_valid
end
it 'is invalid without name' do
user = User.new(
email: '[email protected]',
password: 'password',
password_confirmation: 'password'
)
expect(user).to be_valid
end
end$ vim Gemfile
group :development, :test do
gem 'factory_bot_rails', '~> 5.0.2'
endインストール
bundle installジェネレーターでファイルを用意
bin/rails g factory_bot:model user$ vim spec/factories/users.rb
FactoryBot.define do
factory :user do
name { 'sample user' }
email { '[email protected]' }
password { 'password' }
password_confirmation { 'password' }
end
endこれで User Factory が用意できました
テストを書き直すと
RSpec.describe User, type: :model do
it 'is valid with email, name, password' do
expect(FactoryBot.build(:user)).to be_valid
end
it 'is invalid without name' do
expect(FactoryBot.build(:user, name: nil)).not_to be_valid
end
endこれでテストは通ります
複数ユーザーを用意したときに email アドレスがかぶってしまうので Factory を少し書き換え
FactoryBot.define do
factory :user do
name { 'sample user' }
sequence(:email) { |n| "sample#{n}@sample.com" }
password { 'password' }
password_confirmation { 'password' }
end
endsequence を使うと、create するたびに新しい email が作られます