beマッチャーでオブジェクトの状態を検証しよう

学習の目標

本章では、以下の内容を学習します。

  • beマッチャーの基本的な役割と使用方法を理解する
  • 真偽値(true/false)の検証方法を習得する
  • nilチェックの実装方法を学ぶ
  • ユーザー認証システムを例に、実践的なテストケースの作成方法を習得する
  • beマッチャーの様々なバリエーションについて理解する

はじめに

ここまでのセクションで、expectとマッチャーの基本的な使い方について学んできました。その中で最もよく使うeqマッチャーについても説明しましたね。

今回は、もう一つの重要なマッチャーであるbeについて説明していきます。beマッチャーは、オブジェクトの状態を検証するための強力なツールです。

beマッチャーの役割

beマッチャーは、オブジェクトの状態を検証するためのマッチャーです。以前学んだeqマッチャーと並んで、RSpecで最もよく使われる重要なマッチャーの1つとなっています。

このマッチャーは特に、真偽値やnilの検証に適しています。また、オブジェクトの様々な状態確認を直感的に書けるように設計されています。

具体的には、以下のような状況で活用できます。

  • 値がnilかどうかを検証する場合(例: ユーザーの削除後にデータがnilになっているか)
  • メソッドがtrueまたはfalseを返すかどうかを確認する場合(例: ユーザーが認証されているかどうか)
  • 数値が正か負か、または特定の条件を満たすかどうかを検証する場合

それでは、具体的なコードを通してbeマッチャーの使い方を学んでいきましょう。

実践:beマッチャーを使ってみよう

まずは、テスト対象となるUserクラスを作成します。user.rbというファイルを作成し、以下のコードを書いていきましょう。

class User
def initialize(is_activated: false)
@is_activated = is_activated
end
def activated?
@is_activated
end
end

このシンプルなUserクラスでは、ユーザーが有効化されているかどうかを表すactivated?というメソッドを用意しています。デフォルトでは新規作成時に有効化されていない、つまりfalseの状態になるように実装しています。

では、このコードに対するテストを書いていきましょう。spec/user_spec.rbというファイルを作成し、以下のコードを追加します。

require_relative '../user'
RSpec.describe User do
describe '#activated?' do
it '新規ユーザーは有効化されていない' do
user = User.new
expect(user.activated?).to be false
end
end
end

このテストコードでは、beマッチャーを使用しています。activated?メソッドがfalseを返すことを検証するために、expect(user.activated?).to be falseと記述しています。

では、このテストを実行してみましょう。ターミナルで以下のコマンドを実行します。

bundle exec rspec spec/user_spec.rb

実行すると、次のような結果が表示されるはずです。

User
#activated?
新規ユーザーは有効化されていない
Finished in 0.00231 seconds (files took 0.15594 seconds to load)
1 example, 0 failures

テストが成功したことが確認できました。次に、ユーザーを有効化できる機能を追加してみましょう。

user.rbverify_emailメソッドを追加します。

class User
def initialize(is_activated: false)
@is_activated = is_activated
end
def activated?
@is_activated
end
def verify_email
@is_activated = true
end
end

verify_emailメソッドを呼び出すと、ユーザーが有効化される、つまり@is_activatedtrueになるようになりました。このコードに対するテストも追加していきましょう。

spec/user_spec.rbに新しいテストケースを追加します。

require_relative '../user'
RSpec.describe User do
describe '#activated?' do
it '新規ユーザーは有効化されていない' do
user = User.new
expect(user.activated?).to be false
end
it 'メール認証後のユーザーは有効化される' do
user = User.new
user.verify_email
expect(user.activated?).to be true
end
end
end

追加したテストでは、verify_emailメソッドを呼び出した後に、activated?メソッドがtrueを返すことを検証しています。このテストでも同様にbeマッチャーを使用していますが、今回はbe trueという形で記述しています。

テストを実行して、両方のテストケースが成功することを確認しましょう。

bundle exec rspec spec/user_spec.rb

nilの検証を試してみよう

次は、nilの検証について学んでいきましょう。ユーザークラスにプロフィール文を設定できる機能を追加します。

user.rbprofileメソッドとset_profileメソッドを追加します。

class User
def initialize(is_activated: false)
@is_activated = is_activated
@profile = nil
end
def activated?
@is_activated
end
def verify_email
@is_activated = true
end
def profile
@profile
end
def set_profile(text)
@profile = text
end
end

初期状態ではプロフィールが設定されていない、つまりnilの状態になっており、set_profileメソッドでプロフィール文を設定できるようになっています。

このコードに対するテストを追加してみましょう。spec/user_spec.rbに以下のテストケースを追加します。

require_relative '../user'
RSpec.describe User do
# 前述のテストケースはそのまま残しておきます
describe '#profile' do
it '新規ユーザーはプロフィールが未設定' do
user = User.new
expect(user.profile).to be_nil
end
it 'プロフィール設定後は設定した内容を返す' do
user = User.new
user.set_profile('よろしくお願いします')
expect(user.profile).to eq 'よろしくお願いします'
end
end
end

nilかどうかを検証する場合は、be_nilというマッチャーを使います。これはbeマッチャーの特別な形式の一つです。

テストを実行して、すべてのテストケースが成功することを確認しましょう。

bundle exec rspec spec/user_spec.rb

beマッチャーの様々な形式

beマッチャーには、今回紹介した基本形式以外にも様々なバリエーションがあります。よく使われるものをいくつか紹介します。

be_truthy と be_falsey

Rubyでは、falsenil以外のすべての値は真値(truthy)として扱われます。この真値かどうかを検証するにはbe_truthyを使います。逆に、偽値(falsey)かどうかを検証するにはbe_falseyを使います。

it '真値と偽値の検証' do
expect(true).to be_truthy
expect(1).to be_truthy
expect("hello").to be_truthy
expect(false).to be_falsey
expect(nil).to be_falsey
end

数値の比較

数値が正か負か、ゼロかといった検証には、be_positivebe_negativebe_zeroなどを使います。

it '数値の検証' do
expect(5).to be_positive
expect(-3).to be_negative
expect(0).to be_zero
end

述語マッチャー

Rubyのメソッド名が?で終わる場合(述語メソッドと呼ばれます)、それに対応するbe_xxx形式のマッチャーを使うことができます。

例えば、Arrayクラスのempty?メソッドに対応するbe_emptyマッチャーや、Stringクラスのinclude?メソッドに対応するbe_includeマッチャーなどです。

it '述語マッチャーの例' do
expect([]).to be_empty
expect("hello").to include("lo")
end

これらのマッチャーは、テストコードをより読みやすく、自然な英語の文章に近い形で書けるようにするためのものです。

まとめ

本章では、RSpecのbeマッチャーについて学習しました。以下の内容をマスターできたことと思います。

  • beマッチャーはオブジェクトの状態を検証するために使用される
  • 真偽値(true/false)の検証にはbe truebe falseを使う
  • nilかどうかを検証するにはbe_nilを使う
  • be_truthybe_falseyなどの派生形もある
  • 述語メソッド(?で終わるメソッド)に対応するbe_xxx形式のマッチャーも便利

beマッチャーは、オブジェクトの状態を検証する場面で非常に役立ちます。特に真偽値やnilの検証では、このマッチャーを積極的に活用していくとよいでしょう。

次回は、配列や文字列の検証に使うincludeマッチャーについて説明していきます。配列の要素チェックや文字列の部分一致など、さらに幅広いテストケースに対応できるようになります。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Basicプランでより詳しく学習

この先のコンテンツを読むにはBasicプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
expectとeqマッチャーで動作を検証しよう