0
0

More than 3 years have passed since last update.

初めてのRSpec① 超初心者が参照した記事まとめ モデルテスト編

Posted at

初めに

今回、初めてテストを書きましたが、そもそも書くまでの道のりが長く、、
ややこしかったので参考にしたサイトをまとめてみました。

ひとまず基本を理解する

テストコードちらっとみたことあるけど、
書いたことは全くなかったので以下の記事を読みました。

必要なGem、ファイル、FactoryBot準備

個人的メモ

以下、下の3つ入れます。
gem "factory_bot_rails"はテスト用のサンプルデータを
簡単に作成することができるGemです。
gem 'faker'はダミーデータを作成してくれます。
Gemfile
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'も使いますが、
多分元々入ってるかと思うので確認してください!!

Gemfile
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を入れることにしました。

factories/users.rb
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
models/user_spec.rb
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でもいけました!

終わりに

正直まだまだ理解が浅く、ガバガバなテストしか作れていない気がしますが、
まずは書くことが大事かと思うので、どんどん書いていきたいと思います:fist:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0