モデルのテストコード 【rspec】【完全初心者用の記事です】

モデルのテスト

モデルのテストでは、モデルで設定されたバリデーションに関するテストコードを書いていきます。

 

テストコードの基本

describe "hoge" do
  it "1 + 1は2になること" do
    expect(1 + 1).to eq 2
  end
end
  • describe:テストのグループ化を宣言しています。""内にはそのまとまりの説明を書きます。
  • it:itはテストをexampleと呼ばれる実際に動作するテストコードのまとまりを表します。
  • エクスペクテーション:expect(X).to eq Y で記述し、"X が Y と等しいことを期待する"と読み解きます。ここでは "1 + 1 が 2になることを期待する" テストです。なお、これが正しければ、エクスペクテーションをパスした、テストが成功した、とされます。
  • マッチャ :エクスペクテーションの中で、テストが成功する条件を示します。ここではeq(等しければ)という意味にもなります。抹茶ではありません。

実際にコードを書いていく

以下のようなUserモデルのテストコードを実際に書いていきましょう

user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :tweets
  has_many :comments

  validates :nickname, presence: true, length: { maximum: 6 }

end

 

まずはspec/modelsディレクトリ直下にuser_spec.rbを作成します。

その中に基本となるコードを記述します。

user_spec.rb

require 'rails_helper'
describe User do
  describe '#create' do
    it "is invalid without a nickname" do
user = User.new(nickname: "", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000") user.valid? expect(user.errors[:nickname]).to include("can't be blank")
end
end
end

さぁ、一つ一つ読み解いていきましょう。

  1. require "rails_helper" ではrails_helper.rb内の記述を読み込み、共通の設定を有効にします。これは全てのspecファイルで必要な記述です。
  2. describeはネストにすることができます。ここでは、"Userクラスのテストのまとまり"の中に"Userクラスのcreateメソッドをテストするまとまり"がネストされています。
  3. メソッド名の前には#をつけましょう。
  4.  データを持ったインスタンス変数にvalid?メソッドが適用されています。このメソッドはインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめます。返り値にtrue,flaseを返します。
  5. expectの引数で、インスタンス変数にerrorsメソッドが利用されています。このメソッドは、valid?メソッドを利用したインスタンスに対して、「バリデーションにより保存ができない状態である場合なぜできないのか」を確認することができます。ここでカラム名を指定することで、そのカラムが原因のエラー文(RailsのGemで元々用意されているエラー分)が入った配列を取り出すことができます。
  6. マッチャ としてincludeマッチャ が使われています。これは引数にとった値が、expectの引数である配列に含まれているかをチェックするマッチャ です。ここでは("can't be blank")を引数として設定しており、実際にその通りであればエクスペクテーションはパスしたことになります。

最後にターミナルで"bundle exrec rspec"コマンドを実行し、以下のような結果になればテストは成功した、と言えます。

User
  #create
    is invalid without a nickname

Finished in 0.53132 seconds (files took 3.64 seconds to load)
1 example, 0 failures