expectとeqマッチャーで動作を検証しよう
- 学習の目標
- はじめに
- expectの役割
- expectの基本構文
- 基本的な検証の例
- 失敗するテストを書いてみる
- expectのnot修飾子
- 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) endend
このコードは「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) endend
ファイルを保存して、再度テストを実行してみましょう。
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) endend
このテストを実行すると、両方のテストケースが成功します。「2 * 3が7に等しくないこと」を期待するテストなので、実際の結果が6であれば成功するわけです。
not_to
はto
と対になる修飾子で、期待値と一致しないことを検証したい場合に使います。これにより、テストの柔軟性が増します。
expectで変数を検証する
実際のアプリケーションでは、変数やメソッドの戻り値をテストすることが多いでしょう。expect
は変数の値も同様に検証できます。
RSpec.describe '計算機' do it '変数の値を検証する' do sum = 2 + 3 expect(sum).to eq(5) endend
このテストでは、sum
変数の値が5と等しいことを検証しています。より複雑なアプリケーションでは、メソッドの戻り値や、オブジェクトの状態などを変数に格納して検証することが多くなります。
メソッドの戻り値を検証する
では、メソッドを定義して、その戻り値をテストするケースも見てみましょう。以下のように、簡単な計算機クラスを定義してテストします。
lib/calculator.rb
というファイルを作成し、以下のコードを記述してください。
class Calculator def add(a, b) a + b end
def multiply(a, b) a * b endend
次に、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) endend
このテストコードでは、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 endend
このように、be
マッチャーと組み合わせて、大小関係の比較も直感的に記述できます。上記のテストを実行すると、全て成功するはずです。
まとめ
本章では、RSpecのexpect
メソッドと基本的なマッチャーについて学習しました。以下の内容をマスターできたことと思います。
expect
を使うことで、プログラムの期待する動作を検証できる- 基本的な形は
expect(テスト対象).to eq(期待値)
となる - 「〜でないこと」を検証するには
not_to
を使用する - 変数やメソッドの戻り値も同様に検証できる
- 単純な比較以外にも様々なマッチャーがある
expect
は、RSpecでテストを書く際の中心となる機能です。テストの期待値を明確に記述することで、プログラムの動作を確実に検証できるようになります。
次回の講座では、eq
以外の様々なマッチャーについて詳しく学んでいきます。様々なマッチャーを使いこなすことで、より複雑な条件でもテストができるようになりますので、少しずつ覚えていきましょう。
Basicプランでより詳しく学習
この先のコンテンツを読むにはBasicプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。