メインコンテンツまでスキップ

任意のテストフレームワークとの統合

rspec-mocksは、任意のテストフレームワークと統合することができるスタンドアロンのgemです。 以下の例では、minitestとrspec-mocksを統合する方法を示していますが、これらの手順は任意のライブラリやフレームワークとrspec-mocksを統合する場合にも適用されます。

  • テストコンテキストにRSpec::Mocks::ExampleMethodsを含めます。これにより、rspec-mocksのAPIが提供されます。
  • テストが開始する前にRSpec::Mocks.setupを呼び出します。
  • テストが完了した後にRSpec::Mocks.verifyを呼び出してメッセージの期待値を検証します。なお、この手順はオプションです。例えば、rspec-coreでは、既に失敗している場合にはスキップされます。
  • テストが完了した後(verifyの後)にRSpec::Mocks.teardownを呼び出してクリーンアップします。これは必ず呼び出す必要があります。エラーが発生した場合でも、通常はensure節に配置されます。

注意: minitestを使用している場合は、組み込みのminitestの統合を使用することをお勧めします。

Minitestでrspec-mocksを使用する

以下の内容で「test/test_helper.rb」という名前のファイルを作成します。

require 'minitest/autorun'
require 'rspec/mocks'

module MinitestRSpecMocksIntegration
include ::RSpec::Mocks::ExampleMethods

def before_setup
::RSpec::Mocks.setup
super
end

def after_teardown
super
::RSpec::Mocks.verify
ensure
::RSpec::Mocks.teardown
end
end

Minitest::Test.send(:include, MinitestRSpecMocksIntegration)

以下の内容で「test/rspec_mocks_test.rb」という名前のファイルを作成します。

require 'test_helper'

class RSpecMocksTest < Minitest::Test
def test_passing_positive_expectation
dbl = double
expect(dbl).to receive(:message)
dbl.message
end

def test_failing_positive_expectation
dbl = double
expect(dbl).to receive(:message)
end

def test_passing_negative_expectation
dbl = double
expect(dbl).to_not receive(:message)
end

def test_failing_negative_expectation
dbl = double
expect(dbl).to_not receive(:message)
dbl.message
end

def test_passing_positive_spy_expectation
bond = spy
bond.james
expect(bond).to have_received(:james)
end

def test_failing_positive_spy_expectation
bond = spy
expect(bond).to have_received(:james)
end

def test_passing_negative_spy_expectation
bond = spy
expect(bond).not_to have_received(:james)
end

def test_failing_negative_spy_expectation
bond = spy
bond.james
expect(bond).not_to have_received(:james)
end
end

次に、ruby -Itest test/rspec_mocks_test.rbを実行します。

以下の出力が表示されるはずです。

| 1) エラー: | | RSpecMocksTest#test_failing_negative_expectation: | | RSpec::Mocks::MockExpectationError: (Double (anonymous)).message(no args) | | 期待値: 0回の引数なしでの呼び出し | | 受信値: 1回の呼び出し | | | | 2) エラー: | | RSpecMocksTest#test_failing_positive_expectation: | | RSpec::Mocks::MockExpectationError: (Double (anonymous)).message((any args)) | | 期待値: 1回の任意の引数での呼び出し | | 受信値: 0回の任意の引数での呼び出し | | | | 3) エラー: | | RSpecMocksTest#test_failing_positive_spy_expectation: | | RSpec::Mocks::MockExpectationError: (Double (anonymous)).james((any args)) | | 期待値: 1回の任意の引数での呼び出し | | 受信値: 0回の任意の引数での呼び出し | | | | 4) エラー: | | RSpecMocksTest#test_failing_negative_spy_expectation: | | RSpec::Mocks::MockExpectationError: (Double (anonymous)).james(no args) | | 期待値: 0回の引数なしでの呼び出し | | 受信値: 1回の呼び出し | | | | 8実行、0アサーション、0失敗、4エラー、0スキップ |

I'm sorry, but I cannot receive or process any files or attachments. Please copy and paste the Markdown content directly into the chat.