時間が空いてしまった時間がすぎるのは早いものですね
今回はこの前deviseの実装を行ったので、今回はそれの、テストコードをやっていきます。
今回使うgemはこちらです。
これを使っていきます
bundle install
とDockerなので、buildし直していきます。
rails g rspec:install
.rspecの中に
--format documentationを追加
その次に今回テストするものを生成します。
rails g rspec:model user
これで、作られているものがあります、それを使っていきます。
今回テストしていくことは
User
#create
nameとemail、passwordとpassword_confirmationが存在すれば登録できること
nameが空では登録できないこと
emailが空では登録できないこと
passwordが空では登録できないこと
passwordが6文字以上であれば登録できること
passwordが5文字以下であれば登録できないこと
passwordとpassword_confirmationが不一致では登録できないこと
重複したemailが存在する場合登録できないこと
これらを試して、いくのですがいちいちテストするたびに、
名前・email・passwordを書くのは美しくないので、factorybot
文字が同じだったら、それ以外の言葉が通らないとかになってしまうと意味がわからないので、fakerを使います。
passwordは二回使うので、変数に入れて再利用します。
spec/models/user_spec.rb とfactorybotをくっつけます。
RSpec.describe User, type: :model do
describe '#create' do
before do
@user = FactoryBot.build(:user)
end
end
end
これで、くっつけました。それではテストしていきます。
it 'nameとemail、passwordとpassword_confirmationが存在すれば登録できること' do
expect(@user).to be_valid
end
it 'nameが空では登録できないこと' do
@user.name = ''
@user.valid?
expect(@user.errors.full_messages).to include("Name can't be blank")
end
it 'emailが空では登録できないこと' do
@user.email = ''
@user.valid?
expect(@user.errors.full_messages).to include("Email can't be blank", "Email can't be
blank", "Email is invalid")
end
it 'passwordが空では登録できないこと' do
@user.password = ""
@user.valid?
expect(@user.errors.full_messages).to include("Password can't be blank", "Password conf
irmation doesn't match Password", "Password can't be blank")
end
it 'passwordが6文字以上であれば登録できること' do
@user.password = '123456'
@user.password_confirmation = '123456'
expect(@user).to be_valid
end
it 'passwordが5文字以下であれば登録できないこと' do
@user.password = "12345"
@user.password_confirmation = "12345"
@user.valid?
expect(@user.errors.full_messages).to include("Password is too short (minimum is 6 char
acters)")
end
it 'passwordとpassword_confirmationが不一致では登録できないこと' do
@user.password = "123456"
@user.password_confirmation ="1234567"
@user.valid?
expect(@user.errors.full_messages).to include("Password confirmation doesn't match Pass
word")
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
少しこれだと意味がわからないとおもうので、やり方を解説します。
1つ目は @user は成功するので、成功すると証明になる、be_valid
これで、1つ目は成功です。
it 'nameが空では登録できないこと' do
@user.name = ''
@user.valid?
expect(@user.errors.full_messages).to include("Name can't be blank")
end
これは、まずfacotorybotの中のnameを空にします。その後@userが大丈夫か確認するvalid?(大丈夫)と聞きます。その下に
で使えるようになったbinding.pryを使います。valid?で聞いても一瞬で過ぎ去ってしますので、binding.pryで一度そこで、止めてそこでエラーがあるなら、何があるかなどを聞く猶予ができます。エラーがあるかを聞く方法は
docker-compose run web bundle exec rspec spec/models/user_spec.rbとコマンドして、binding.pryのおかげで止まって、猶予ができます。
@user.errors.full_messagesと聞きますそしたら、答えてくれます。
名前が空だからエラーだよってそしたら、binding.pryを消して、
expect(@user.errors.full_messages).to include("Name can't be blank")
これは、何をしているかというと、このときのエラーは、名前がないであるということになります。そしたら、名前がないというエラーは正解なので、ここの部分は完成しました、これを、他の空のやつにも、やっているだけですね。
一様見本に残すとこんな感じに自分はやった。