任意のテストフレームワークとの統合
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.