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  endendこのシンプルな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  endendこのテストコードでは、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.rbにverify_emailメソッドを追加します。
class User  def initialize(is_activated: false)    @is_activated = is_activated  end
  def activated?    @is_activated  end
  def verify_email    @is_activated = true  endendverify_emailメソッドを呼び出すと、ユーザーが有効化される、つまり@is_activatedがtrueになるようになりました。このコードに対するテストも追加していきましょう。
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  endend追加したテストでは、verify_emailメソッドを呼び出した後に、activated?メソッドがtrueを返すことを検証しています。このテストでも同様にbeマッチャーを使用していますが、今回はbe trueという形で記述しています。
テストを実行して、両方のテストケースが成功することを確認しましょう。
bundle exec rspec spec/user_spec.rbnilの検証を試してみよう
次は、nilの検証について学んでいきましょう。ユーザークラスにプロフィール文を設定できる機能を追加します。
user.rbにprofileメソッドと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  endend初期状態ではプロフィールが設定されていない、つまり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  endendnilかどうかを検証する場合は、be_nilというマッチャーを使います。これはbeマッチャーの特別な形式の一つです。
テストを実行して、すべてのテストケースが成功することを確認しましょう。
bundle exec rspec spec/user_spec.rbbeマッチャーの様々な形式
beマッチャーには、今回紹介した基本形式以外にも様々なバリエーションがあります。よく使われるものをいくつか紹介します。
be_truthy と be_falsey
Rubyでは、falseとnil以外のすべての値は真値(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_falseyend数値の比較
数値が正か負か、ゼロかといった検証には、be_positive、be_negative、be_zeroなどを使います。
it '数値の検証' do  expect(5).to be_positive  expect(-3).to be_negative  expect(0).to be_zeroend述語マッチャー
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 trueやbe falseを使う
- nilかどうかを検証するにはbe_nilを使う
- be_truthyや- be_falseyなどの派生形もある
- 述語メソッド(?で終わるメソッド)に対応するbe_xxx形式のマッチャーも便利
beマッチャーは、オブジェクトの状態を検証する場面で非常に役立ちます。特に真偽値やnilの検証では、このマッチャーを積極的に活用していくとよいでしょう。
次回は、配列や文字列の検証に使うincludeマッチャーについて説明していきます。配列の要素チェックや文字列の部分一致など、さらに幅広いテストケースに対応できるようになります。
Basicプランでより詳しく学習
この先のコンテンツを読むにはBasicプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。