モデルのテストコード 【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
さぁ、一つ一つ読み解いていきましょう。
- require "rails_helper" ではrails_helper.rb内の記述を読み込み、共通の設定を有効にします。これは全てのspecファイルで必要な記述です。
- describeはネストにすることができます。ここでは、"Userクラスのテストのまとまり"の中に"Userクラスのcreateメソッドをテストするまとまり"がネストされています。
- メソッド名の前には#をつけましょう。
- データを持ったインスタンス変数にvalid?メソッドが適用されています。このメソッドはインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめます。返り値にtrue,flaseを返します。
- expectの引数で、インスタンス変数にerrorsメソッドが利用されています。このメソッドは、valid?メソッドを利用したインスタンスに対して、「バリデーションにより保存ができない状態である場合なぜできないのか」を確認することができます。ここでカラム名を指定することで、そのカラムが原因のエラー文(RailsのGemで元々用意されているエラー分)が入った配列を取り出すことができます。
- マッチャ として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