😺
[RSpec]RSpecの基本②構成要素と、ディレクトリ構成について
前回はこのように、理論的な基礎部分を記述していきました。
ここで前回の内容を簡単におさらいすると...
rspecとは
- RSpecとは?
RSpecは、Ruby言語で書かれたBDD(Behavior-Driven Development)フレームワークの1つで、
テスト駆動開発(TDD)に基づいたテストを記述するためのツール. - RSpecはなぜ使われる?(目的)
ソフトウェアの品質を向上させること。具体的には、バグの早期発見、品質の維持・向上、開発効率の向上、チームワークの向上などが挙げられる。 - RSpecの特徴は?
BDDに基づいた記述方法が採用されており、テストコードの可読性や保守性を高めることができること。
また、テストの対象となるコードの振る舞い(Behavior)を重視するため、より自然言語に近い記述が可能。
RSpecの構成について
- describe: テストの対象が何かを記述。※必須記述
- context: 特定の条件が何かを記述。
- exampleやit: アウトプット内容が何かを記述。実際のテストを記述する※必須記述
【書き方(定型文)】
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