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 endend
verify_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.rb
nilの検証を試してみよう
次は、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 endend
nilかどうかを検証する場合は、be_nil
というマッチャーを使います。これはbe
マッチャーの特別な形式の一つです。
テストを実行して、すべてのテストケースが成功することを確認しましょう。
bundle exec rspec spec/user_spec.rb
beマッチャーの様々な形式
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プラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。