初めてRSpecに触ったので覚え書きを

RSpecについて

RSpecディレクトリ構成

specファイルは、specディレクトリ以下に格納する。specファイルの位置は、appディレクトリ以下にあるテストの対象となるファイルの位置と対応させる。

◼︎例

app/models/

→spec/models/

specファイルの命名規則

specファイルは、対応するクラス名_spec.rbとなる。

◼︎例

app/models/user.rb

→spec/models/user_spec.rb

テストの書き方

describe テストグループ
  it 'テストする内容' do
    expect(チェックされる式).to 期待される結果
  end
end

it do ~endまでを1つのテストとする。これをexampleを呼ぶ。

describe

describeは、直後のdo ~endまでのテストのグループを作る。describeの後に続く''の中にテストのグループの説明をする。

itとexample

itはexampleと呼ばれるテストコードのまとまりを表す。itの後に続く''の中には、exmapleの説明をする。

エクスペクテーション

エクスペクテーションとは、実際に評価される式のこと。it do ~ endの間に書く。

マッチャ

マッチャは、エクスペクテーションの中で、テストが成功する条件を示す。マッチャはeq(等しければ)やincludde(含んでいれば)など複数のマッチャが存在する。

◼︎例

ユーザーを保存するときに名前が入力されていない場合のテスト

require 'rails_helper'

describe User do
  describe '#create' do
    it 'is invalid without a name' do
      user = User.new(name: '')
      user.valid?
      expect(user.errors[:name]).to include("can't be blank')
    end
  end
end

解説

1行めのrequire 'rails_helperは、rails_helper.rbを読み込み共通の設定を有効にしている。すべてのspecファイルで読み込む。

3, 4行めでdescribeがネストされて繰り返されている。意味としては、「Userクラスのcreateメソッドをテストするまとまり」ということになる。メソッドをテストするので、#をつけてある。

5行めでnameプロパティを持ったUserクラスのインスタンスを新規作成した。

6行めでvalid?を使い、作成したインスタンスがバリデーション(nameに対して、presence: trueのバリデーションがかかっている前提)によって保存できないことを確認する。

7行めでerrorsを使い、validによって追加された保存できない理由に「cant't be blank」が含まれいるかテストする