爆速でモデルテストを書き上げる！！！[10分]

#はじめに
今回は爆速でモデルのテストを書き上げます！！
ぜひ参考に！！
#前提
今回はUserモデルを例にとってテストを書き上げていきます！！

###テーブル

| カラム名      |       型 |    オプション   |
|:-----------------|------------------:|:------------------:|
| email             |              This |   null: false        |
| encrypted_password          |            string |       null: false       |
|nickname          |              string |           |
| introduction               |                text |           |
※deviseを導入しているのでもう少しカラムがありますが、省略します。
###バリデーション
```ruby:user.rb
class User < ApplicationRecord
  〜省略〜
  validates :nickname, presence: true, length: { maximum: 6 }
  validates :introduction, presence: true
end
```
#rspecの導入

```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end

group :development do
  gem 'web-console'
end
```
※web_console というgemはtest環境で動かすと不具合が起きる可能性があるgemなのでdevelopment環境でのみ動くようにします。

```ruby:ターミナル
bundle install
```
```ruby:ターミナル
rails g rspec:install
```
次のようなファイルが生成されます。

```ruby:ターミナル
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```
作成された.rspecに以下を追加

```ruby:.rspec
--format documentation
````

#rspec確認

```ruby:ターミナル
bundle exec rspec
```
```ruby:ターミナル
No examples found.


Finished in 0.00111 seconds (files took 0.19535 seconds to load)
0 examples, 0 failures
```
こんな感じになればOKです。

#下準備
specディレクトリが作成されているはずです。
<img width="1440" alt="スクリーンショット 2019-10-10 21.19.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/a2a658c8-0869-8d17-234b-af61156683de.png">

その中にfactoriesディレクトリとmodelディレクトリを作成しましょう。

その後、
factoriesディレクトリの中にはusers.rb
modelディレクトリの中にはuser_spec.rb
というファイルを作成しましょう。

<img width="1440" alt="スクリーンショット 2019-10-10 21.28.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/a290b76a-6b13-b5ff-5afd-6da88b885655.png">
上記のようになっていればOKです。

#テストコードの記載
まずはspec/factories/user.rbにサンプルデータを作成します。

```ruby:spec/factories/user.rb
FactoryBot.define do

  factory :user do
    nickname              {"山田太郎"}
    introduction          {"こんにちは"}
    email                 {"sample@gmail.com"}
    password              {"00000000"}
    password_confirmation {"00000000"}
  end

end
```
テストコードを書いていきます。

```ruby:spec/model/user_spec.rb
require 'rails_helper'

describe User do
  describe '#create' do

    it "ニックネームがないと登録できない" do
      user = build(:user, nickname: nil)
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end

    it "ニックネームが7文字以上では登録できない " do
      user = build(:user, nickname: "aaaaaaaa")
      user.valid?
      expect(user.errors[:nickname][0]).to include("is too long")
    end

      it "自己紹介がないと登録できない" do
        user = build(:user, introduction: nil)
        user.valid?
        expect(user.errors[:introduction]).to include("can't be blank")
      end

    it "e-mailがないと登録できない" do
      user = build(:user, email: nil)
      user.valid?
      expect(user.errors[:email]).to include("can't be blank")
    end

    it "パスワードがないと登録できない" do
      user = build(:user, password: nil)
      user.valid?
      expect(user.errors[:password]).to include("can't be blank")
    end

    it "パスワード確認がないと登録できない" do
      user = build(:user, password_confirmation: "")
      user.valid?
      expect(user.errors[:password_confirmation]).to include("doesn't match Password")
    end

    it "全て満たしていれば登録できる" do
      user = build(:user)
      expect(user).to be_valid
    end

  end

end
```
テストコードのポイントは失敗例と成功例両方書いておくことです。
書けましたね。ターミナルで確認してみましょう！！！

```ruby:ターミナル
bundle exec rspec
```
```ruby:ターミナル
User
  #create
    ニックネームがないと登録できない
    ニックネームが7文字以上では登録できない
    自己紹介がないと登録できない
    e-mailがないと登録できない
    パスワードがないと登録できない
    パスワード確認がないと登録できない
    全て満たしていれば登録できる

Finished in 0.45572 seconds (files took 4.21 seconds to load)
7 examples, 0 failures

```

こんな感じで出れば成功です！！！
赤い文字でfailuresが出る場合はバリデーションかテストコードのどちらかが間違っているので確認してみましょう。

#おわりに
とても簡単だったと思います。
今回はカラム数の少ないモデルでテストを行いましたが、カラム数が増えてもやることは同じです。
ぜひ参考にテストコードを書いてみましょう。
では:guardsman::guardsman: