testをやってみた パート4

時間が空いてしまった時間がすぎるのは早いものですね

今回はこの前deviseの実装を行ったので、今回はそれの、テストコードをやっていきます。

今回使うgemはこちらです。

f:id:karma83:20210227161045p:plain

これを使っていきます

bundle install 

とDockerなので、buildし直していきます。

 

rails g rspec:install

 .rspecの中に

--format documentationを追加

f:id:karma83:20210227161929p:plain

その次に今回テストするものを生成します。

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を使います。

f:id:karma83:20210227162455p:plain

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?(大丈夫)と聞きます。その下に
gem 'pry-rails'

で使えるようになった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")

これは、何をしているかというと、このときのエラーは、名前がないであるということになります。そしたら、名前がないというエラーは正解なので、ここの部分は完成しました、これを、他の空のやつにも、やっているだけですね。

一様見本に残すとこんな感じに自分はやった。 

f:id:karma83:20210227164348p:plain