expectとeqマッチャーで動作を検証しよう

学習の目標

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

  • expectメソッドの基本的な役割と重要性を理解する
  • expect構文の基本形の書き方を習得する
  • eqマッチャーを使用した基本的な値の検証方法を学ぶ
  • テストコードの可読性向上におけるexpectの利点を理解する
  • シンプルなテストケースを自分で記述できるようになる

はじめに

前回はitブロックを使ってテストケースを書く方法を学びました。今回は、テストで最も重要となるexpectについて説明します。これはRSpecのテストにおいて、実際に「何を期待しているのか」を明確に示すための中心的な機能です。

expectの役割

expectは、プログラムのテストにおいて期待する動作を明確にするための機能です。英語で「期待する」という意味を持つように、プログラムの振る舞いへの期待を表現します。

具体的には、「このメソッドを実行したらこの値が返ってくるはずだ」といった期待を記述することができます。たとえば、「加算メソッドに2と3を渡したら5が返ってくるはず」というような検証が可能になります。

これは単なる機能的な意味だけでなく、テストコードを読む人にとっても重要な意味を持ちます。expectを使って書かれたテストコードを見れば、そのプログラムがどのような動作をすることを期待されているのかが明確に分かるためです。

expectの基本構文

それでは、expectの基本的な形を見てみましょう。

expect(テスト対象).to eq(期待値)

この構文では、テスト対象の値と期待する値が等しいかどうかを確認します。ここで使用しているeqは「マッチャー」と呼ばれる機能の一つです。マッチャーは、テスト対象が期待通りかどうかを判断する方法を指定します。

最もよく使うマッチャーがeqで、これは「等しい」ことを確認するためのものです。マッチャーには他にもたくさんの種類がありますが、まずは基本的なeqの使い方をしっかり理解しておきましょう。

基本的な検証の例

それでは、具体的な例を見ながらexpectの使い方を確認していきましょう。新しいファイルを作成して、シンプルなテストを書いてみます。

spec/calculator_spec.rbというファイルを作成または編集して、以下のコードを記述してください。

RSpec.describe '計算機' do
it '2足す3は5になる' do
expect(2 + 3).to eq(5)
end
end

このコードは「2 + 3 が 5 に等しいことを期待する」という意味になります。単純な例ですが、期待する計算結果をexpectで明確に検証しています。

ファイルを保存したら、ターミナルで以下のコマンドを実行してテストを走らせてみましょう。

bundle exec rspec spec/calculator_spec.rb

テストが成功すると、以下のような出力が表示されます。

計算機
2足す3は5になる
Finished in 0.00179 seconds (files took 0.08765 seconds to load)
1 example, 0 failures

この結果から、私たちの期待通り「2+3=5」となり、テストが成功したことがわかります。

失敗するテストを書いてみる

次に、わざと失敗するテストを書いて、expectがどのように動作するかを確認してみましょう。先ほどのファイルに以下のテストケースを追加します。

RSpec.describe '計算機' do
it '2足す3は5になる' do
expect(2 + 3).to eq(5)
end
it '2掛ける3は7になる' do # わざと間違えています
expect(2 * 3).to eq(7)
end
end

ファイルを保存して、再度テストを実行してみましょう。

bundle exec rspec spec/calculator_spec.rb

今度は以下のようなエラーメッセージが表示されるはずです。

計算機
2足す3は5になる
2掛ける3は7になる (FAILED - 1)
Failures:
1) 計算機 2掛ける3は7になる
Failure/Error: expect(2 * 3).to eq(7)
expected: 7
got: 6
(compared using ==)
# ./spec/calculator_spec.rb:7:in `block (2 levels) in <top (required)>'
Finished in 0.02519 seconds (files took 0.08998 seconds to load)
2 examples, 1 failure

このエラーメッセージを見ると、「期待していた値は7だが、実際に得られた値は6だった」ことがわかります。expectによって、テスト対象(2 * 3)と期待値(7)の不一致が明確に示されています。

expectのnot修飾子

テストでは、「〜であることを期待する」だけでなく、「〜でないことを期待する」という検証も必要になることがあります。その場合はnot_toを使用します。

以下のようにテストケースを追加してみましょう。

RSpec.describe '計算機' do
it '2足す3は5になる' do
expect(2 + 3).to eq(5)
end
it '2掛ける3は7にならない' do
expect(2 * 3).not_to eq(7)
end
end

このテストを実行すると、両方のテストケースが成功します。「2 * 3が7に等しくないこと」を期待するテストなので、実際の結果が6であれば成功するわけです。

not_totoと対になる修飾子で、期待値と一致しないことを検証したい場合に使います。これにより、テストの柔軟性が増します。

expectで変数を検証する

実際のアプリケーションでは、変数やメソッドの戻り値をテストすることが多いでしょう。expectは変数の値も同様に検証できます。

RSpec.describe '計算機' do
it '変数の値を検証する' do
sum = 2 + 3
expect(sum).to eq(5)
end
end

このテストでは、sum変数の値が5と等しいことを検証しています。より複雑なアプリケーションでは、メソッドの戻り値や、オブジェクトの状態などを変数に格納して検証することが多くなります。

メソッドの戻り値を検証する

では、メソッドを定義して、その戻り値をテストするケースも見てみましょう。以下のように、簡単な計算機クラスを定義してテストします。

lib/calculator.rbというファイルを作成し、以下のコードを記述してください。

class Calculator
def add(a, b)
a + b
end
def multiply(a, b)
a * b
end
end

次に、spec/calculator_spec.rbを以下のように修正します。

require_relative '../lib/calculator'
RSpec.describe Calculator do
it 'addメソッドで2足す3は5になる' do
calculator = Calculator.new
expect(calculator.add(2, 3)).to eq(5)
end
it 'multiplyメソッドで2掛ける3は6になる' do
calculator = Calculator.new
expect(calculator.multiply(2, 3)).to eq(6)
end
end

このテストコードでは、Calculatorクラスのインスタンスを作成し、そのメソッドの戻り値を検証しています。実際のアプリケーション開発では、このようにクラスやメソッドの振る舞いを検証することが一般的です。

ファイルを保存して、テストを実行してみましょう。

bundle exec rspec spec/calculator_spec.rb

両方のテストが成功することを確認してください。

eq以外のシンプルな比較

eqは「等しい」ことを検証するマッチャーですが、他にも基本的な比較用のマッチャーがあります。たとえば、大小関係を検証する場合などです。

RSpec.describe '比較' do
it '5は3より大きい' do
expect(5).to be > 3
end
it '2は5より小さい' do
expect(2).to be < 5
end
it '5は5以上である' do
expect(5).to be >= 5
end
end

このように、beマッチャーと組み合わせて、大小関係の比較も直感的に記述できます。上記のテストを実行すると、全て成功するはずです。

まとめ

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

  • expectを使うことで、プログラムの期待する動作を検証できる
  • 基本的な形はexpect(テスト対象).to eq(期待値)となる
  • 「〜でないこと」を検証するにはnot_toを使用する
  • 変数やメソッドの戻り値も同様に検証できる
  • 単純な比較以外にも様々なマッチャーがある

expectは、RSpecでテストを書く際の中心となる機能です。テストの期待値を明確に記述することで、プログラムの動作を確実に検証できるようになります。

次回の講座では、eq以外の様々なマッチャーについて詳しく学んでいきます。様々なマッチャーを使いこなすことで、より複雑な条件でもテストができるようになりますので、少しずつ覚えていきましょう。

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

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

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

作成者:とまだ
Previous
itで期待する振る舞いを定義しよう