RSpec学習メモ(everyday Rails RSpecによるRailsテスト入門 第3章)

<モデルスペックの構造>

モデルスペックには次のようなテストを含まれるようにする。

 

• 有効な属性で初期化された場合は、モデルの状態が有効(valid)になっていること。
• バリデーションを失敗させるデータであれば、モデルの状態が有効になっていないこと。

クラスメソッドとインスタンスメソッドが期待通りに動作すること。

 

---------------------------------------------------------------------------------------

 

<モデルスペックの基本構成>

describe User do
  # 姓、名、メール、パスワードがあれば有効な状態であること

  it "is valid with a first name, last name, email, and password" # 名がなければ無効な状態であること
  it "is invalid without a first name"
  # 姓がなければ無効な状態であること
  it "is invalid without a last name"
  # メールアドレスがなければ無効な状態であること
  it "is invalid without an email address"
  # 重複したメールアドレスなら無効な状態であること
  it "is invalid with a duplicate email address"
  # ユーザーのフルネームを文字列として返すこと
  it "returns a user's full name as a string"

end

 

ポイント

・期待する結果をまとめて記述(discribe)している。

・example(itで始まる行)一つにつき、結果を一つだけ期待している。

・どのexampleも明示的である。

・各 exampleの説明は動詞で始まっている。shouldではない。

 

これらを念頭に置きながらモデルのスペックを作成していく。

 

$ bundle exec rails g spec:model user

# spec/models/user_spec.rb が作成される。

# 必ずしもスペックファイルを作成するためにジェネレーターを利用する必要はないが、ジェネレーターを使用することはタイプミスによるエラーを防止するための良い方法である。

 

<spec/models/user_spec.rb>

require ‘rails_helper’

# この記述でRSpecに対し、ファイル内のテストを実行するためにRailsアプリケーションの読み込みが必要であることを伝えている。

 

RSpec.describe User, type: :model do

# describeメソッドを使って、Userという名前のモデルのテストをここに書くことを明示している。

 

---------------------------------------------------------------------------------------

 

<バリデーションをテストする>

新しく作ったユーザー(first_nameには明示的にnilをセットする)に対して、valid?メソッドを呼び出すと有効(valid)にならず、ユーザーのfirst_name属性にエラーメッセージがついていることを期待(expect)する。

 

ポイント

テストが失敗するところを確認することも重要。誤判定ではないことを確認するためには二つの方法がある。

 

①toをto_notに変えてエクスペーションを反転させる。(not_toでも可)

②アプリケーション側のコードを変更して、テストの実行結果にどんな変化が起きるのかを確認する。

 

---------------------------------------------------------------------------------------

 

<describe, context, before, afterを使用してスペックをDRYにする>

・describeではクラスやシステムの機能に関するアウトラインを記述し、contextでは特定の状態に関するアウトラインを記述する。

RSpecのbeforeフックはスペック内の冗長なコードを認識し、きれいにするための言い出発点となる。

before(:each)describeまたはcontextブロック内の各テストの前に実行される。

 

---------------------------------------------------------------------------------------

 

<まとめ>

・期待する結果は能動系で明示的に記述すること。

・起きて欲しいことと、起きて欲しくないことをテストすること。

・境界値をテストすること。

・可読性を上げるためにスペックを整理するが大事だが、テストの場合はDRYであることよりも読みやすいことの方が重要。(DRYすぎてもダメ)