LoginSignup
1
2

More than 3 years have passed since last update.

【初心者向け】RSpecによる単体テストの記載方法(モデル編)

Last updated at Posted at 2020-07-30

specファイルの基本

以下のように、specファイルは配置します

app
# 省略
spec
 L model
     L モデル名_spec.rb
 L controller
     L コントローラー名_spec.rb

ファイル名は、「対応するクラス名_spec.rb」になる。
例えば
user.rb(モデル)のテスト → user_spec.rb
tweets_controlle(コントローラー)のテスト → 

テストの書き方(モデルとアクションの指定)

userモデルのcreateアクションのテストをする場合。
userモデルに、こんなバリデーションがあったとします。

app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
end

この時、「nameが空欄だったらuserを作れない」ことをテストしようと思います。
まず、外側の書き方はこんな感じです。

spec/model/user_spec.rb
require 'rails_helper'

describe User do
  describe '#create' do
    it 'is invalid without a name' do
     #ここにテストの内容を書きます
    end
  end
end

userモデルのテストなので、クラス名は「User」
createアクションのテストなので、慣習的に「'#create']と書きます。

it~do の間には何のテストなのかを書きます。
ここは日本語でもOKです。

テストの書き方(テスト内容の指定)

次に、テストの内容を書いていきます。

spec/model/user_spec.rb
describe User do
  describe '#create' do
    it 'is invalid without a name' do
      user = User.new(name: "", email: "test@email.com", password: "11111111", password_confirmation: "11111111")
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
  end
end

user = User.new()の部分で、今回テストするユーザーのインスタンスを生成しています。

user.valid? の「valid?」は、ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめるためのメソッドです。

expect(user.errors[:name]).to ないの user.errors[:name:name カラムに対するエラーメッセージを呼び出しています。(エラーメッセージはrails側で定義されています)。

そして、そのエラーメッセージに "を入力してください" が含まれているのかをテストしています。

・・・なんだかいろいろ難しいので、もう少し練習して慣れようと思います。
次は、次は、factory botを使って、ダミーデータを用意する手順について書こうと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2