Jay
2006-Sep-22 12:39 UTC
[mocha-developer] foo.expects(:blah).returns(10).then(11) syntax
I recently needed the behavior of my object to change on subsequent method calls so I added the syntax above. Here''s the diff of changes I made: Index: test/mocha/expectation_test.rb ==================================================================--- test/mocha/expectation_test.rb (revision 854) +++ test/mocha/expectation_test.rb (working copy) @@ -95,6 +95,12 @@ assert_equal 99, expectation.invoke end + def test_should_return_values_in_order + expectation = Expectation.new(:expected_method).returns(9).then(10) + assert_equal 9, expectation.invoke + assert_equal 10, expectation.invoke + end + def test_should_return_nil_if_no_value_specified expectation = Expectation.new(:expected_method) assert_nil expectation.invoke Index: lib/mocha/expectation.rb ==================================================================--- lib/mocha/expectation.rb (revision 854) +++ lib/mocha/expectation.rb (working copy) @@ -21,7 +21,7 @@ @method_name = method_name @count = 1 @parameters, @parameter_block = AlwaysEqual.new, nil - @invoked, @return_value = 0, nil + @invoked = 0 @backtrace = backtrace || caller end @@ -69,19 +69,29 @@ end def returns(value) - @return_value = value + return_value << value self end + + def then(value) + return_value << value + self + end + + def return_value + @return_value ||= [] + end def raises(exception = RuntimeError, message = nil) - @return_value = lambda{ raise exception, message } + return_value << lambda{ raise exception, message } self end def invoke @invoked += 1 yield(*@parameters_to_yield) if yield? and block_given? - @return_value.is_a?(Proc) ? @return_value.call : @return_value + this_return = return_value.size > 1 ? return_value.shift : return_value.first + this_return.is_a?(Proc) ? this_return.call : this_return end def verify
James Mead
2006-Sep-24 21:17 UTC
[mocha-developer] foo.expects(:blah).returns(10).then(11) syntax
On 22/09/06, Jay <jay at jayfields.com> wrote:> > I recently needed the behavior of my object to change on subsequent > method calls so I added the syntax above. > > Here''s the diff of changes I made: > > Index: test/mocha/expectation_test.rb > ==================================================================> --- test/mocha/expectation_test.rb (revision 854) > +++ test/mocha/expectation_test.rb (working copy) > @@ -95,6 +95,12 @@ > assert_equal 99, expectation.invoke > end > > + def test_should_return_values_in_order > + expectation = Expectation.new(:expected_method).returns(9).then(10) > + assert_equal 9, expectation.invoke > + assert_equal 10, expectation.invoke > + end > + > def test_should_return_nil_if_no_value_specified > expectation = Expectation.new(:expected_method) > assert_nil expectation.invoke > Index: lib/mocha/expectation.rb > ==================================================================> --- lib/mocha/expectation.rb (revision 854) > +++ lib/mocha/expectation.rb (working copy) > @@ -21,7 +21,7 @@ > @method_name = method_name > @count = 1 > @parameters, @parameter_block = AlwaysEqual.new, nil > - @invoked, @return_value = 0, nil > + @invoked = 0 > @backtrace = backtrace || caller > end > > @@ -69,19 +69,29 @@ > end > def returns(value) > - @return_value = value > + return_value << value > self > end > + > + def then(value) > + return_value << value > + self > + end > + > + def return_value > + @return_value ||= [] > + end > > def raises(exception = RuntimeError, message = nil) > - @return_value = lambda{ raise exception, message } > + return_value << lambda{ raise exception, message } > self > end > def invoke > @invoked += 1 > yield(*@parameters_to_yield) if yield? and block_given? > - @return_value.is_a?(Proc) ? @return_value.call : @return_value > + this_return = return_value.size > 1 ? return_value.shift : > return_value.first > + this_return.is_a?(Proc) ? this_return.call : this_return > end > def verify >Hi Jay, Thanks for your patch and in particular for including a test. Interestingly I recently made a change (revision #55) to allow consecutive return values to be specified like this... object = mock() object.expects(:expected_method).returns(:result1, :result2, :result3) object.expected_method # => :result1 object.expected_method # => :result2 object.expected_method # => :result3 object.expected_method # => nil I wonder if this would be sufficient for your needs. Let me know what you think. I hope to do a release in the next few days. Thanks. -- James. http://blog.floehopper.org -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/mocha-developer/attachments/20060924/0ea64413/attachment.html
Jay
2006-Sep-25 12:05 UTC
[mocha-developer] foo.expects(:blah).returns(10).then(11) syntax
Yes, sorry. I should have checked out trunk before sending you something :) I do like the fluent interface that Mocha provides. I was trying to think of something more readable and would allow you to return values and then raise. I considered then_return and then_raise, but in the end neither seemed better than simply providing a comma delimited list. Anyway, thanks for the response. Jay On Sep 24, 2006, at 5:17 PM, James Mead wrote:> On 22/09/06, Jay <jay at jayfields.com> wrote: > I recently needed the behavior of my object to change on subsequent > method calls so I added the syntax above. > > Here''s the diff of changes I made: > > Index: test/mocha/expectation_test.rb > ==================================================================> --- test/mocha/expectation_test.rb (revision 854) > +++ test/mocha/expectation_test.rb (working copy) > @@ -95,6 +95,12 @@ > assert_equal 99, expectation.invoke > end > > + def test_should_return_values_in_order > + expectation = Expectation.new(:expected_method).returns(9).then > (10) > + assert_equal 9, expectation.invoke > + assert_equal 10, expectation.invoke > + end > + > def test_should_return_nil_if_no_value_specified > expectation = Expectation.new(:expected_method) > assert_nil expectation.invoke > Index: lib/mocha/expectation.rb > ==================================================================> --- lib/mocha/expectation.rb (revision 854) > +++ lib/mocha/expectation.rb (working copy) > @@ -21,7 +21,7 @@ > @method_name = method_name > @count = 1 > @parameters, @parameter_block = AlwaysEqual.new, nil > - @invoked, @return_value = 0, nil > + @invoked = 0 > @backtrace = backtrace || caller > end > > @@ -69,19 +69,29 @@ > end > def returns(value) > - @return_value = value > + return_value << value > self > end > + > + def then(value) > + return_value << value > + self > + end > + > + def return_value > + @return_value ||= [] > + end > > def raises(exception = RuntimeError, message = nil) > - @return_value = lambda{ raise exception, message } > + return_value << lambda{ raise exception, message } > self > end > def invoke > @invoked += 1 > yield(*@parameters_to_yield) if yield? and block_given? > - @return_value.is_a?(Proc) ? @return_value.call : @return_value > + this_return = return_value.size > 1 ? return_value.shift : > return_value.first > + this_return.is_a?(Proc) ? this_return.call : this_return > end > def verify > > Hi Jay, > > Thanks for your patch and in particular for including a test. > Interestingly I recently made a change (revision #55) to allow > consecutive return values to be specified like this... > > object = mock() > object.expects(:expected_method).returns > (:result1, :result2, :result3) > > object.expected_method # => :result1 > object.expected_method # => :result2 > object.expected_method # => :result3 > object.expected_method # => nil > > I wonder if this would be sufficient for your needs. Let me know > what you think. > > I hope to do a release in the next few days. > > Thanks. > -- > James. > http://blog.floehopper.org > _______________________________________________ > mocha-developer mailing list > mocha-developer at rubyforge.org > http://rubyforge.org/mailman/listinfo/mocha-developer-------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/mocha-developer/attachments/20060925/b8446a50/attachment-0001.html