RSpecは特有な書き方があるので、初めて書く際にはまず基本的な文法を習得しておかないと進められない部分があります。

こちらの記事では、最低でも知っておいた方が良いかなと思うRSpecの基本的な書き方をまとめておきます。

ブロック構文

describe・context

describeは、テスト内容・項目毎にグループ分けするために使用されます。

describe 'ユーザー登録に関するテスト' do
  ~
end

describe 'ユーザー削除に関するテスト' do
  ~
end

contextは、テストケースの状態などで分けるためによく使用されます。

例えば、以下のような感じでテストケースの状態に分けてブロックを書けば可読性を上げるのに一役買います。

context '検索後にデータがヒットした場合' do
  ~
end

context '検索後にデータがヒットしない場合' do
  ~
end

before

テスト(it構文)を実行する前に実行される構文で、主にテストを実行する前に準備しておきたい処理を書くために利用します。

before do
  ~
end

before構文が無くてもit構文にまとめて処理を書けますが、before構文とit構文を分けた方が意図が読めて可読性も上がります。

before構文で取得したデータをit構文で利用したい場合は、メンバ変数を用意すればit構文でも参照できます。

before do
  # メンバ変数を作成
  @user = FactoryBot.create :user
end

it 'テスト' do
  # it構文で利用可能
  expect(@user.name).to eq '名前'
end

ですがメンバ変数を用意するよりも、後述するlet構文を利用した方がメリットが高いです。

after

before構文とは反対に、ブロック内のテストが実行された後に実行されます。

after do
  ~
end

解放処理などに利用すると良いですが、あまり利用する機会は少ないかもです。

it

実際の検証コードを記述するブロックです。

it 'ユーザー名が「NoName」と設定されている' do
  expect(@user.name).to eq 'NoName'
end

検証は一つのitに対して一つの結果を見るようにすると、検証に失敗した場合に失敗した箇所を特定しやすいです。

ちなみに、以下2つはitと同じ役割の別名(エイリアス)となります。

  • example
  • specify

let

テストを行うためのデータの準備にlet構文を利用します。

引数にシンボルを指定し、ブロックに参照したいデータの生成などを行って準備します。

あとは定義したletを各ブロック内で呼び出せるようになります。

let(:user) { FactoryBot.create :user }

it do
  expect(user.name).to eq 'NoName'
end

最初は扱いが少し複雑ではありますが、データを共有できるという意味でも便利なので積極的に利用してみると良いかと思います。

RSpec特有の構文

expect

「期待する」という意味で、テストする値を渡しマッチャを用いて検証します。

# system_spec
# 最終結果のページに'テキスト'というコンテンツが表示されているか
expect(page).to have_context 'テキスト'

ちなみに、以前の構文ではshould構文が使用されていました。

to・to_not

expectが持つメソッドで、toメソッドの後に続くマッチャ構文の実行結果が期待値通りかを判断します。

to_notは期待する値を反転させます。

to_notメソッド以外にもnot_toメソッドもあり、どちらも同じ挙動をします。

マッチャ

処理結果を期待値と比較するための構文です。

マッチャに関しては独自にカスタマイズが可能らしいです。

eq処理結果のequal?メソッドの返り値と期待値が同等かを検証します。
include処理結果のinclude?メソッドの返り値と期待値が同等かを検証します。
be_empty処理結果のempty?メソッドの返り値と期待値が同等かを検証します。
be_valid処理結果のモデルのvalid?メソッドの返り値と期待値が同等かを検証します。
マッチャ一覧

メソッド一覧

change

値が変化したかを検証します。

x = 1
expect { x += 1 }.to change { x }

=> true

from・by

changeメソッドの後にfrom・byメソッドを呼ぶことで、検証結果が最初の値からどれだけ増減したかを検証します。

x = 1
expect { x += 2 }.to change { x }.from(1).by(2)

=> true

投稿者: TWEI

趣味はプログラミング。 以前は仕事でプログラミングをやっていました。現在はWebエンジニアを目指して勉強中。 勉強で得た知識などをブログで発信していく予定です。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA