#概要
今回は、userモデルの単体テストコードをrspecを導入して記述する流れをまとめます。
それに伴い、FactoryBotとFakerも導入して実装したので記述します。
###FactoryBotとは
テスト用のデータを作成してくれるツールです。
###Fakerとは
FactoryBotで作られたデータにランダムに中身を追加することが出来ます。
##gemの導入、準備
ポイントとして、Gemfileの記述場所に注意しましょう。
一番下ではありません。
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'faker'
end
このあと
$ bundle install
します。
次に、コマンドを実行して、RSpecを書くためのディレクトリなどの生成を行います。
rails g rspec:install
すると、ディレクトリやファイルが生成されるはずです。
次に、.rspecに以下の記述をしましょう。
--require spec_helper
--format documentation
最後に、FactoryBotのファイルを生成しましょう。
specディレクトリのなかにfactoriesディレクトリを自作し、今回はusers.rbを作成します。
これで下準備はOKです。
##FactoryBotでの値を指定
先ほど作成したファイルにそれぞれ値を定義していきましょう。
FactoryBot.define do
factory :user do
nickname {Faker::Name.last_name}
email {Faker::Internet.free_email}
password = Faker::Internet.password(min_length: 6)
password {password}
password_confirmation {password}
family_name { "山田" }
first_name {"太郎"}
read_family {"ヤマダ"}
read_first {"タロウ"}
birth {Faker::Date.between(from: '1930-01-01', to: '2015-12-31')}
end
end
ここでのポイントは、Fakerを利用しているところと、利用できないところがあることです。
Fakerは英数字しかランダムに生成できません。
よって、family_nameなどは今回は適当に値をつけときました。
日本語のダミーデータを作れるgemもあるようですが、今回は見送りました。
##テストコードの記述
まずは準備として、テストコードを書いていくファイルをコマンドで生成します。
rails g rspec:model user
すると、
spec/models/user_spec.rb
が生成します。
そこに単体テストコードを書いていきましょう。
require 'rails_helper'
RSpec.describe User, type: :model do
describe '#create' do
before do
@user = FactoryBot.build(:user)
end
it "nicknameが空だと登録できない" do
@user.nickname = nil
@user.valid?
expect(@user.errors.full_messages).to include("Nickname can't be blank")
end
it "emailが空だと登録できない" do
@user.email = nil
@user.valid?
expect(@user.errors.full_messages).to include("Email can't be blank")
end
it "emailに一意性がないと登録できない" do
@user.save
another_user = FactoryBot.build(:user, email: @user.email)
another_user.valid?
expect(another_user.errors.full_messages).to include("Email has already been taken")
end
---省略---
end
end
長いのでかなり省略しましたが、こんな感じで記述していきます。
ポイントは、
before doでちゃんとFactoryBotのデータをインスタンス変数で定義することです。
これを忘れて@userがnilになり、一回迷子になってしまいました(ド素人)
しっかり記述できたらターミナルで
bundle exec rspec spec/models/user_spec.rb
コマンドを入力してテストを実行してみましょう。