rspec-railsでモデルをテストしてみる

f:id:utouto97:20210704222355j:plain

Railsでモデル作成

Railsでモデルを作成します。

$ rails g model User name:string

これで、モデルを作成できました。
次のようなログがでました。

Running via Spring preloader in process 83
      invoke  active_record
      create    db/migrate/20210804132134_create_users.rb
      create    app/models/user.rb
      invoke    rspec
      create      spec/models/user_spec.rb

このログにも書いてある通り、マイグレーションファイル、モデル定義のapp/models/user.rbのほかに、テスト用のファイルも自動生成されました。
spec/models/user_spec.rbです。
ここにUserモデルのテストを書いていきます。

モデルを作成した後は、マイグレーションを実行しておく必要があります。
ここでは、テスト環境でのマイグレーションのみ実行しておきます。

$ rails db:migrate RAILS_ENV=test

テストを書く前に、Userモデルに簡単なバリデーションを設定しておきます。

class User < ApplicationRecord
  validates :name, presence: true, uniqueness: true
end

バリデーションの内容は、「空は無効」と「重複不可」です。

モデルをテストしてみる

rspec-railsを使って、テストを書いていきます。

require 'rails_helper'

RSpec.describe User, type: :model do
  it "有効な場合" do
    user = User.create(name: "Bob")
    expect(user).to be_valid
  end

  it "nameが空欄の場合、無効" do
    user = User.create(name: nil)
    expect(user).to be_invalid
  end

  it "nameが重複している場合、無効" do
    user1 = User.create(name: "Ken")
    user2 = User.create(name: "Ken")
    expect(user2).to be_invalid
  end
end

テストの実行はrspecコマンドで行います。

$ rspec
...

Finished in 0.03052 seconds (files took 0.75964 seconds to load)
3 examples, 0 failures

終わり