I lied, I don''t actually need different responses each time I call the method. So the last email of mine is probably worthless. Instead, I need yield to yield 3 values when I call it once: (behavior that mimics Find.find) def test_generate(documentation = ''/test_documentation/'', destination = ''/destination/'') Find.expects(:find).with(documentation).multiyield (''filename.yaml'', ''blah.xml'') File.expects(:directory?).with(''filename.yaml'') File.expects(:directory?).with(''blah.xml'') .... end So, I wrote multiyield.... Index: test/mocha/expectation_test.rb ==================================================================--- test/mocha/expectation_test.rb (revision 62) +++ test/mocha/expectation_test.rb (working copy) @@ -91,6 +91,13 @@ assert_equal parameters_for_yield, yielded_parameters end + def test_should_yield_multiple_times_with_multiyield + expectation = new_expectation.multiyield(:foo, 1, ''bar'') + actual = [] + expectation.invoke() { |parameter| actual << parameter } + assert_equal [:foo, 1, ''bar''], actual + end + def test_should_return_specified_value expectation = new_expectation.returns(99) assert_equal 99, expectation.invoke Index: lib/mocha/expectation.rb ==================================================================--- lib/mocha/expectation.rb (revision 62) +++ lib/mocha/expectation.rb (working copy) @@ -26,6 +26,10 @@ @yield = nil end + def multiyield? + @multiyield + end + def yield? @yield end @@ -178,6 +182,12 @@ @parameters_to_yield = parameters self end + + def multiyield(*parameters) + @multiyield = true + @parameters_to_yield = parameters + self + end # :call-seq: returns(value) -> expectation # :call-seq: returns(*values) -> expectation @@ -218,6 +228,7 @@ def invoke @invoked += 1 yield(*@parameters_to_yield) if yield? and block_given? + @parameters_to_yield.each { |element| yield(element) } if multiyield? and block_given? @return_value.is_a?(Proc) ? @return_value.call : @return_value end Is this already in the framework and I missed it?
On 29/09/06, Jay <jay at jayfields.com> wrote:> > I lied, I don''t actually need different responses each time I call > the method. So the last email of mine is probably worthless. > > Instead, I need yield to yield 3 values when I call it once: > (behavior that mimics Find.find) > def test_generate(documentation = ''/test_documentation/'', > destination = ''/destination/'') > Find.expects(:find).with(documentation).multiyield > (''filename.yaml'', ''blah.xml'') > File.expects(:directory?).with(''filename.yaml'') > File.expects(:directory?).with(''blah.xml'') > .... > end > > So, I wrote multiyield.... > Index: test/mocha/expectation_test.rb > ==================================================================> --- test/mocha/expectation_test.rb (revision 62) > +++ test/mocha/expectation_test.rb (working copy) > @@ -91,6 +91,13 @@ > assert_equal parameters_for_yield, yielded_parameters > end > + def test_should_yield_multiple_times_with_multiyield > + expectation = new_expectation.multiyield(:foo, 1, ''bar'') > + actual = [] > + expectation.invoke() { |parameter| actual << parameter } > + assert_equal [:foo, 1, ''bar''], actual > + end > + > def test_should_return_specified_value > expectation = new_expectation.returns(99) > assert_equal 99, expectation.invoke > Index: lib/mocha/expectation.rb > ==================================================================> --- lib/mocha/expectation.rb (revision 62) > +++ lib/mocha/expectation.rb (working copy) > @@ -26,6 +26,10 @@ > @yield = nil > end > > + def multiyield? > + @multiyield > + end > + > def yield? > @yield > end > @@ -178,6 +182,12 @@ > @parameters_to_yield = parameters > self > end > + > + def multiyield(*parameters) > + @multiyield = true > + @parameters_to_yield = parameters > + self > + end > # :call-seq: returns(value) -> expectation > # :call-seq: returns(*values) -> expectation > @@ -218,6 +228,7 @@ > def invoke > @invoked += 1 > yield(*@parameters_to_yield) if yield? and block_given? > + @parameters_to_yield.each { |element| yield(element) } if > multiyield? and block_given? > @return_value.is_a?(Proc) ? @return_value.call : @return_value > end > > Is this already in the framework and I missed it?No it''s not in the framework already. Thanks for the patch. Am I correct in thinking this patch only deals with simulating a method that yields multiple times with a single parameter each time, like this... def my_method yield(1) yield(2) end I''m wondering if we should also deal with the more generic case where different numbers of parameters could be yielded each time, like this... def my_method yield(1) yield(2,3) end I like the way yields() currently mirrors the behaviour of returns(), but it''s becoming clear that yields() has to deal with more multiplicity - you can only return once from a method with a single value; whereas you can yield multiple values multiple times from a single method. It would be good to deal with all this multiplicity at once with a single simple syntax. Thoughts? -- James. http://blog.floehopper.org -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/mocha-developer/attachments/20061006/7004e49c/attachment.html
> No it''s not in the framework already. Thanks for the patch. Am I > correct in thinking this patch only deals with simulating a method > that yields multiple times with a single parameter each time, like > this... > > def my_method > yield(1) > yield(2) > end >Yes, what I submitted only works for the above type scenario> I''m wondering if we should also deal with the more generic case > where different numbers of parameters could be yielded each time, > like this... > > def my_method > yield(1) > yield(2,3) > end >You could handle this by passing in an array as an element of the array. Then, in the yield you could yield and splat the value being yielded.> I like the way yields() currently mirrors the behaviour of returns > (), but it''s becoming clear that yields() has to deal with more > multiplicity - you can only return once from a method with a single > value; whereas you can yield multiple values multiple times from a > single method. It would be good to deal with all this multiplicity > at once with a single simple syntax.Of course, I only made the change that fits what I need. :) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/mocha-developer/attachments/20061009/f771620a/attachment-0001.html