😺

[RSpec]RSpecの基本②構成要素と、ディレクトリ構成について

2023/03/25に公開

前回はこのように、理論的な基礎部分を記述していきました。

ここで前回の内容を簡単におさらいすると...

rspecとは
  • RSpecとは?
    RSpecは、Ruby言語で書かれたBDD(Behavior-Driven Development)フレームワークの1つで、
    テスト駆動開発(TDD)に基づいたテストを記述するためのツール.
  • RSpecはなぜ使われる?(目的)
    ソフトウェアの品質を向上させること。具体的には、バグの早期発見、品質の維持・向上、開発効率の向上、チームワークの向上などが挙げられる。
  • RSpecの特徴は?
    BDDに基づいた記述方法が採用されており、テストコードの可読性や保守性を高めることができること。
    また、テストの対象となるコードの振る舞い(Behavior)を重視するため、より自然言語に近い記述が可能。

RSpecの構成について

  • describe: テストの対象が何かを記述。※必須記述
  • context: 特定の条件が何かを記述。
  • exampleit: アウトプット内容が何かを記述。実際のテストを記述する※必須記述

書き方(定型文)

describe テスト対象(クラス名orメソッド名),type: :model do
  context "テストの対象クラス" do
    it "どんな状況の処理なのか(アウトプットの内容)" do
         〜処理の記述〜
    end
end

エクスペクテーションとマッチャー

  • expect(X).to eq Y  で記述するのがエクスペクテーション。
    expect には「期待する」という意味があり、
    expect(X).to eq Yは、「XがYに等しくなることを期待する」と読む。

  • eqの部分はマッチャーという。

  • マッチャー(matcher):
    期待する値と実際の値が一致するかどうかを判定し、一致しない場合にはエラーを出力するもの。

  • RSpecには、多数のマッチャが用意されており、それぞれの検証に適したマッチャを選択して使用することができる。

代表的なマッチャー 一覧

マッチャー名 機能 ex.
be_valid 有効であるか expect(record).to be_valid
be_invalid 無効であるか expect(record).to be_invalid
include 配列に指定の値が含まれているか expect(array).to include(value)
find 要素の検索を行う expect(page).to have_selector(selector)
click クリックを行う expect(page).to have_selector(selector).click
have_content 文字列が存在するか expect(page).to have_content(text)
have_link 指定の値のリンクが存在するか expect(page).to have_link(link_text)
eq 期待値と値を比較して一致するか expect(value).to eq(expected_value)
have_selector HTMLタグやCSSに指定の文字列が存在するか expect(page).to have_selector(selector)
have_field 入力フォームが存在するか expect(page).to have_field(field_name)
find_all ページ上の指定のHTMLタグを全て取得する all(selector)
match matchメソッドを使用して期待値と一致するか expect(value).to match(expected_value)
have_button ページ上に指定のボタンが存在するか expect(page).to have_button(button_text)
click_button 指定のボタンをクリックする click_button(button_text)
have_current_path パスを取得できる expect(current_path).to eq(expected_path)
change ある動作Aに対してBが変動するか expect { some_method }.to change { some_variable }.from(a).to(b)

RSpecのディレクトリ構成について

project/
├── app/
├── config/
├── lib/
└── spec/  *RSpecでテストコードを格納するためのディレクトリ
    ├── controllers/  *コントローラーに対するテストコードを置くディレクトリ
    ├── models/      *モデルに対するテストコードを置くディレクトリ
    ├── features/    *機能に対するテストコードを置くディレクトリ
    ├── support/     *テストコードで使用するサポートファイルを置くためのディレクトリ
    │   ├── helpers/    *RSpecのテストで使用するヘルパーメソッドを定義する場所
    │   └── matchers/   *独自のマッチャーを定義するための場所
    └── spec_helper.rb  *spec/ ディレクトリ以下のテストスイートで共通の設定を行う場所

ではこれを利用して、投稿サイトの例に当てはめてみる。

ex. 投稿サイト(コメント、いいね機能つき)

POSTクラスのテストコードを作成するとき…このようになる!!!

投稿サイト
├── app
│   ├── controllers
│   │   ├── posts_controller.rb
│   │   └── comments_controller.rb
|   |   └── likes_controller.rb
│   └── models
│       ├── post.rb
│       └── comment.rb
│       └── like.rb
└── spec
    ├── controllers
    │   ├── posts_controller_spec.rb
    │   └── comments_controller_spec.rb
    │   └── likes_controller_spec.rb
    ├── models
    │   ├── post_spec.rb
    │   └── comment_spec.rb
    │   └── like_spec.rb
    └── spec_helper.rb


Discussion