[Rails]Rspecを使ったテストコード
はじめに
Rspecを導入し、テストコードを書いてみようと思います。
コマンドはdocker環境のコマンドを使う。
Gemの導入
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'faker', "~> 2.8"
end
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'faker', "~> 2.8"
end
docker-compose run web bundle install
docker-compose build
インストール完了。
Rspecの設定
docker-compose run webrails g rspec:install
上記コマンドを行うと、下記ファイルが生成される。
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
.rspc
--format documentation
コード作成
spec/models/user_spec.rb
require 'rails_helper'
describe User do
describe '#create' do
it "usernameとemail,passwordとpassword_comnfirmationが存在すれば登録できること" do
user = build(:user)
expect(user).to be_valid
end
it "usernameがない場合は登録できないこと" do
user = build(:user, username: nil)
user.valid?
expect(user.errors[:username]).to include("can't be blank")
end
it "emailがない場合は登録できないこと" do
user = build(:user, email: nil)
user.valid?
expect(user.errors[:email]).to include("can't be blank")
end
it "passwordがない場合は登録できないこと" do
user = build(:user, password: nil)
user.valid?
expect(user.errors[:password]).to include("can't be blank")
end
it "passwordが存在してもpassword_confirmationがない場合は登録できないこと" do
user = build(:user, password_confirmation: "")
user.valid?
expect(user.errors[:password_confirmation]).to include("doesn't match Password")
end
it "重複したemailがある場合は登録できないこと" do
user = create(:user)
another_user = build(:user, email: user.email)
another_user.valid?
expect(another_user.errors[:email]).to include("has already been taken")
end
it "passwordが6文字以上であれば登録できること" do
user = build(:user, password: "000000", password_confirmation: "000000")
expect(user).to be_valid
end
it "passwordが5文字以下であれば登録できないこと" do
user = build(:user, password: "00000", password_confirmation: "00000")
user.valid?
expect(user.errors[:password]).to include("is too short (minimum is 6 characters)")
end:grin:
end
end
spec/factories/users.rb
FactoryBot.define do
factory :user do
username {"aaa"}
password {"000000"}
password_confirmation {"000000"}
sequence(:email) {Faker::Internet.email}
end
end
require 'rails_helper'
describe User do
describe '#create' do
it "usernameとemail,passwordとpassword_comnfirmationが存在すれば登録できること" do
user = build(:user)
expect(user).to be_valid
end
it "usernameがない場合は登録できないこと" do
user = build(:user, username: nil)
user.valid?
expect(user.errors[:username]).to include("can't be blank")
end
it "emailがない場合は登録できないこと" do
user = build(:user, email: nil)
user.valid?
expect(user.errors[:email]).to include("can't be blank")
end
it "passwordがない場合は登録できないこと" do
user = build(:user, password: nil)
user.valid?
expect(user.errors[:password]).to include("can't be blank")
end
it "passwordが存在してもpassword_confirmationがない場合は登録できないこと" do
user = build(:user, password_confirmation: "")
user.valid?
expect(user.errors[:password_confirmation]).to include("doesn't match Password")
end
it "重複したemailがある場合は登録できないこと" do
user = create(:user)
another_user = build(:user, email: user.email)
another_user.valid?
expect(another_user.errors[:email]).to include("has already been taken")
end
it "passwordが6文字以上であれば登録できること" do
user = build(:user, password: "000000", password_confirmation: "000000")
expect(user).to be_valid
end
it "passwordが5文字以下であれば登録できないこと" do
user = build(:user, password: "00000", password_confirmation: "00000")
user.valid?
expect(user.errors[:password]).to include("is too short (minimum is 6 characters)")
end:grin:
end
end
FactoryBot.define do
factory :user do
username {"aaa"}
password {"000000"}
password_confirmation {"000000"}
sequence(:email) {Faker::Internet.email}
end
end
docker-compose run web bundle exec rspec
8 examples, 0 failures
となれば、テストはうまく通過している。
おわりに
今回はRspecを使ったテストの入りを行いました。
今後、コントローラーのテストも行っていきます。
最後まで読んでいただきありがとうございます
Author And Source
この問題について([Rails]Rspecを使ったテストコード), 我々は、より多くの情報をここで見つけました https://qiita.com/Nishi-Shin/items/96e19ebd716b5b13ade1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .