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

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

<h2>ひとまず基本を理解する</h2>

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

https://note.com/devtetsu/n/nd29c50468480

https://qiita.com/jnchito/items/2a5d3e15761fd413657a


<h2>必要なGem、ファイル、FactoryBot準備</h2>

https://qiita.com/nakachan1994/items/29369470d50d0fcd0f6c



<details><summary>個人的メモ</summary><div>
以下、下の３つ入れます。
```gem "factory_bot_rails"```はテスト用のサンプルデータを
簡単に作成することができるGemです。
```gem 'faker'```はダミーデータを作成してくれます。

```perl: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'```も使いますが、
多分元々入ってるかと思うので確認してください！！

```perl: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
```
</div></details>

<h2>テストを書く</h2>

https://qiita.com/nakachan1994/items/d869db15f8482ba70d02



<h2>コマンドまとめ</h2>

モデル作成

```
rails g rspec:model　モデル名
```
テストの実行

```
bundle exec rspec spec/models
```

<h2>少し難しかったところ</h2>

私はユーザーの新規登録で部署（departmentモデル）を選択させていました。
やはりテストでも、departmentの情報を入れてあげないと
どうにもこうにも進みませんでした。どこに入れて良いかわかりませんでしたが、
シンプルに考え、
user_spec.rbのbefore do~で@departmentを入れることにしました。

```perl: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
```



```perl: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文字以上であること　１文字はエラーメッセージ' 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```でもいけました！

<h2>終わりに</h2>

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