初めに
今回、初めてテストを書きましたが、そもそも書くまでの道のりが長く、、 ややこしかったので参考にしたサイトをまとめてみました。ひとまず基本を理解する
テストコードちらっとみたことあるけど、
書いたことは全くなかったので以下の記事を読みました。
必要なGem、ファイル、FactoryBot準備
個人的メモ
group :development, :test do
# デバッグ
gem 'pry-byebug'
gem 'rubocop', require: false
gem 'rspec-rails'
gem "factory_bot_rails"
gem 'faker'
end
gem 'capybara', '>= 2.15'
も使いますが、
多分元々入ってるかと思うので確認してください!!
group :test do
# Adds support for Capybara system testing and selenium driver
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
# Easy installation and use of chromedriver to run system tests with Chrome
# gem 'chromedriver-helper'
gem 'webdrivers', '~> 3.0'
end
gem 'chromedriver-helper'
を
gem 'webdrivers', '~> 3.0'
に書き換えています。
Rspec実行する時にエラーが出たので下記の記事を参考に修正しています。
https://techtechmedia.com/chrome-web-driver/
インストールしましょう。
bundle install
以下で必要なファイルをインストールします。
rails g rspec:install
テストを書く
コマンドまとめ
モデル作成
rails g rspec:model モデル名
テストの実行
bundle exec rspec spec/models
少し難しかったところ
私はユーザーの新規登録で部署(departmentモデル)を選択させていました。
やはりテストでも、departmentの情報を入れてあげないと
どうにもこうにも進みませんでした。どこに入れて良いかわかりませんでしたが、
シンプルに考え、
user_spec.rbのbefore do~で@departmentを入れることにしました。
FactoryBot.define do
factory :user do
association :department
name { Faker::Lorem.characters(number: 4) }
email { Faker::Internet.email }
# introduction { Faker::Lorem.characters(number: 20) }
join_year { '新入社員' }
department_id { 1 }
password { 'password' }
password_confirmation { 'password' }
end
end
require 'rails_helper'
RSpec.describe 'Userモデルのテスト', type: :model do
describe 'モデルのテスト' do
before do
@department = Department.create(id: '1', name: '未登録', correct_name: '未登録')
end
it "有効なuserの場合は保存されるか" do
expect(build(:user)).to be_valid
end
context 'nameカラム' do
it '空欄であればエラーメッセージがかえる' do
user = build(:user, name: nil)
user.valid?
expect(user.errors[:name]).to include("を入力してください")
end
it '2文字以上であること 1文字はエラーメッセージ' do
user = create(:user)
user.name=Faker::Lorem.characters(number: 1)
user.valid?
expect(user.errors[:name]).to include("は2文字以上で入力してください")
end
it '9文字以上はエラーメッセージ' do
user = create(:user)
user.name=Faker::Lorem.characters(number: 9)
user.valid?
expect(user.errors[:name]).to include("は8文字以内で入力してください")
end
end
context 'introductionカラム' do
it '401文字以上はエラーメッセージ' do
user = create(:user)
user.introduction=Faker::Lorem.characters(number: 401)
user.valid?
expect(user.errors[:introduction]).to include("は400文字以内で入力してください")
end
end
end
end
別にエラーメッセージのチェックはいらなくてバリデーション引っかかるかだけでいいなら、
expect(user.valid?).to eq false
でもいけました!
終わりに
正直まだまだ理解が浅く、ガバガバなテストしか作れていない気がしますが、
まずは書くことが大事かと思うので、どんどん書いていきたいと思います