From 26a2fb2a9eb390aa6f87035c45eaa384798fff27 Mon Sep 17 00:00:00 2001 From: David Chelimsky Date: Wed, 13 May 2009 08:26:13 -0500 Subject: [PATCH] add preliminary support for invokes() --- lib/mocha/expectation.rb | 12 +++++++++++- test/acceptance/stub_and_invoke_test.rb | 28 ++++++++++++++++++++++++++++ test/unit/expectation_test.rb | 18 ++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletions(-) create mode 100644 test/acceptance/stub_and_invoke_test.rb diff --git a/lib/mocha/expectation.rb b/lib/mocha/expectation.rb index 5dddac9..20019bb 100644 --- a/lib/mocha/expectation.rb +++ b/lib/mocha/expectation.rb @@ -306,6 +306,10 @@ module Mocha # :nodoc: @return_values += ReturnValues.new(ExceptionRaiser.new(exception, message)) self end + + def invokes(&block) + @invocable_block = block + end # :call-seq: then() -> expectation # then(state_machine.is(state)) -> expectation @@ -393,6 +397,7 @@ module Mocha # :nodoc: @return_values = ReturnValues.new @yield_parameters = YieldParameters.new @backtrace = backtrace || caller + @invocable_block = nil end def add_ordering_constraint(ordering_constraint) @@ -420,6 +425,7 @@ module Mocha # :nodoc: end def match?(actual_method_name, *actual_parameters) + @actual_parameters = actual_parameters.dup @method_matcher.match?(actual_method_name) && @parameters_matcher.match?(actual_parameters) && in_correct_order? end @@ -439,7 +445,11 @@ module Mocha # :nodoc: yield(*yield_parameters) end end - @return_values.next + if @invocable_block then + @invocable_block.call(*@actual_parameters) + else + @return_values.next + end end def verified?(assertion_counter = nil) diff --git a/test/acceptance/stub_and_invoke_test.rb b/test/acceptance/stub_and_invoke_test.rb new file mode 100644 index 0000000..f3c8851 --- /dev/null +++ b/test/acceptance/stub_and_invoke_test.rb @@ -0,0 +1,28 @@ +require File.join(File.dirname(__FILE__), "acceptance_test_helper") +require 'mocha' + +class StubAndInvokeTest < Test::Unit::TestCase + + include AcceptanceTest + + def setup + setup_acceptance_test + end + + def teardown + teardown_acceptance_test + end + + def test_should_invoke_block_submitted_to_invokes_without_arguments + obj = stub() + obj.stubs(:my_instance_method).invokes {:this_block} + assert_equal :this_block, obj.my_instance_method + end + + def test_should_invoke_block_submitted_to_invokes_with_arguments + obj = stub() + obj.stubs(:my_instance_method).invokes {|a,b| a + b} + assert_equal 7, obj.my_instance_method(3,4) + end + +end \ No newline at end of file diff --git a/test/unit/expectation_test.rb b/test/unit/expectation_test.rb index 3a37e54..fc48c0d 100644 --- a/test/unit/expectation_test.rb +++ b/test/unit/expectation_test.rb @@ -477,4 +477,22 @@ class ExpectationTest < Test::Unit::TestCase assert expectation.match?(:method_one) end + def test_should_invoke_block_passed_to_invokes + expectation = Expectation.new(nil, :expected_method) + expectation.invokes {:this_block} + expectation.match?(:expected_method) + assert_equal :this_block, expectation.invoke + end + + def test_should_pass_actual_parameters_to_invoked_block + expectation = new_expectation + submitted_args = nil + expectation.invokes do |*args| + submitted_args = args + end + expectation.match?(:expected_method, :a, :b) + expectation.invoke + assert_equal [:a, :b], submitted_args + end + end -- 1.6.0.2