Bas Vodde
2012-Apr-15 06:32 UTC
[rspec-users] RSpec exactly behavior (it doesn''t exactly fail)
Hiya all, I''ve got a quick question related to RSpec. I was test-driving some code and ended up in an endless loop. I was surprised by this, but traced it down to the mock not failing on additional calls but only in the end. Let me explain. I was writing code like this: subject.wrapper.should_receive(:window_list).exactly(4).times.and_return { counter = counter + 1 counter >= 4 ? [ "new window" ] : [] } The idea was that it would call the code-block 4 times exactly and then return a new value (and thus stop calling it). As the code to implement wasn''t there yet, it led to a recursive call. I had expected RSpec to stop after 4 calls though, as I had instructed the mock that I expected exactly 4 calls. I added a new test in RSpec itself in precision_counts_spec.rb: it "fails when a method is called more than n times, but fails within the method call" do @mock.should_receive(:random_call).exactly(1).times lambda do @mock.random_call @mock.random_call end.should raise_error(RSpec::Mocks::MockExpectationError) end which failed :( (or it failed to fail and therefore failed!) It would be nice if it would fail. Is there any reason for not failing already at this point in time? (I''m using RSpec 2.6-0. I quickly browsed the latest and didn''t see this changed) Thanks, Bas
David Chelimsky
2012-Apr-15 21:48 UTC
[rspec-users] RSpec exactly behavior (it doesn''t exactly fail)
On Sunday, April 15, 2012 at 1:32 AM, Bas Vodde wrote:> > Hiya all, > > I''ve got a quick question related to RSpec. I was test-driving some code and ended up in an endless loop. I was surprised by this, but traced it down to the mock not failing on additional calls but only in the end. Let me explain. > > I was writing code like this: > > subject.wrapper.should_receive(:window_list).exactly(4).times.and_return { > counter = counter + 1 > counter >= 4 ? [ "new window" ] : [] > } > > The idea was that it would call the code-block 4 times exactly and then return a new value (and thus stop calling it). As the code to implement wasn''t there yet, it led to a recursive call. I had expected RSpec to stop after 4 calls though, as I had instructed the mock that I expected exactly 4 calls. > > I added a new test in RSpec itself in precision_counts_spec.rb: > > it "fails when a method is called more than n times, but fails within the method call" do > @mock.should_receive(:random_call).exactly(1).times > lambda do > @mock.random_call > @mock.random_call > end.should raise_error(RSpec::Mocks::MockExpectationError) > end > > which failed :( (or it failed to fail and therefore failed!) > > It would be nice if it would fail. Is there any reason for not failing already at this point in time? > > (I''m using RSpec 2.6-0. I quickly browsed the latest and didn''t see this changed) > > Thanks, > > BasThere is no philosophical reason for this to happen, and there are other types of failures that do fail-fast (e.g. obj.should_receive(:bar).with(1,2) fails immediately if it receives :bar with any other args). Please submit this to https://github.com/rspec/rspec-mocks/issues and I''ll start looking into a fix. Cheers, David -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20120415/936ae615/attachment.html>
David Chelimsky
2012-Apr-16 02:14 UTC
[rspec-users] RSpec exactly behavior (it doesn''t exactly fail)
Actually I just went ahead and fixed it sans-bug report: https://github.com/rspec/rspec-mocks/commit/fb9c76c2e40b4b25f4dcc5de95f8c60319b6d9c1. It''ll be fixed in the next release (2.10). Cheers, David -- David Chelimsky Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Sunday, April 15, 2012 at 4:48 PM, David Chelimsky wrote:> On Sunday, April 15, 2012 at 1:32 AM, Bas Vodde wrote: > > > > Hiya all, > > > > I''ve got a quick question related to RSpec. I was test-driving some code and ended up in an endless loop. I was surprised by this, but traced it down to the mock not failing on additional calls but only in the end. Let me explain. > > > > I was writing code like this: > > > > subject.wrapper.should_receive(:window_list).exactly(4).times.and_return { > > counter = counter + 1 > > counter >= 4 ? [ "new window" ] : [] > > } > > > > The idea was that it would call the code-block 4 times exactly and then return a new value (and thus stop calling it). As the code to implement wasn''t there yet, it led to a recursive call. I had expected RSpec to stop after 4 calls though, as I had instructed the mock that I expected exactly 4 calls. > > > > I added a new test in RSpec itself in precision_counts_spec.rb: > > > > it "fails when a method is called more than n times, but fails within the method call" do > > @mock.should_receive(:random_call).exactly(1).times > > lambda do > > @mock.random_call > > @mock.random_call > > end.should raise_error(RSpec::Mocks::MockExpectationError) > > end > > > > which failed :( (or it failed to fail and therefore failed!) > > > > It would be nice if it would fail. Is there any reason for not failing already at this point in time? > > > > (I''m using RSpec 2.6-0. I quickly browsed the latest and didn''t see this changed) > > > > Thanks, > > > > Bas > There is no philosophical reason for this to happen, and there are other types of failures that do fail-fast (e.g. obj.should_receive(:bar).with(1,2) fails immediately if it receives :bar with any other args). > > Please submit this to https://github.com/rspec/rspec-mocks/issues and I''ll start looking into a fix. > > Cheers, > David > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20120415/71511e24/attachment.html>
Bas Vodde
2012-Apr-16 02:30 UTC
[rspec-users] RSpec exactly behavior (it doesn''t exactly fail)
Hiya, Kewl, thanks! (To be honest, I was a bit disapointed as I was thinking of doing it myself and sending it to you :P) Anyways, much appreciated! Bas On 16-Apr-2012, at 10:14 AM, David Chelimsky wrote:> Actually I just went ahead and fixed it sans-bug report: https://github.com/rspec/rspec-mocks/commit/fb9c76c2e40b4b25f4dcc5de95f8c60319b6d9c1. It''ll be fixed in the next release (2.10). > > Cheers, > David > > -- > David Chelimsky > Sent with Sparrow > > On Sunday, April 15, 2012 at 4:48 PM, David Chelimsky wrote: > >> On Sunday, April 15, 2012 at 1:32 AM, Bas Vodde wrote: >>> >>> Hiya all, >>> >>> I''ve got a quick question related to RSpec. I was test-driving some code and ended up in an endless loop. I was surprised by this, but traced it down to the mock not failing on additional calls but only in the end. Let me explain. >>> >>> I was writing code like this: >>> >>> subject.wrapper.should_receive(:window_list).exactly(4).times.and_return { >>> counter = counter + 1 >>> counter >= 4 ? [ "new window" ] : [] >>> } >>> >>> The idea was that it would call the code-block 4 times exactly and then return a new value (and thus stop calling it). As the code to implement wasn''t there yet, it led to a recursive call. I had expected RSpec to stop after 4 calls though, as I had instructed the mock that I expected exactly 4 calls. >>> >>> I added a new test in RSpec itself in precision_counts_spec.rb: >>> >>> it "fails when a method is called more than n times, but fails within the method call" do >>> @mock.should_receive(:random_call).exactly(1).times >>> lambda do >>> @mock.random_call >>> @mock.random_call >>> end.should raise_error(RSpec::Mocks::MockExpectationError) >>> end >>> >>> which failed :( (or it failed to fail and therefore failed!) >>> >>> It would be nice if it would fail. Is there any reason for not failing already at this point in time? >>> >>> (I''m using RSpec 2.6-0. I quickly browsed the latest and didn''t see this changed) >>> >>> Thanks, >>> >>> Bas >> There is no philosophical reason for this to happen, and there are other types of failures that do fail-fast (e.g. obj.should_receive(:bar).with(1,2) fails immediately if it receives :bar with any other args). >> >> Please submit this to https://github.com/rspec/rspec-mocks/issues and I''ll start looking into a fix. >> >> Cheers, >> David > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
David Chelimsky
2012-Apr-16 02:34 UTC
[rspec-users] RSpec exactly behavior (it doesn''t exactly fail)
Sorry about that. I don''t always jump on things like that, but this one was bugging me and I had the time so I just did it. That doesn''t always happen :) I look forward to your future contributions. Cheers, David -- David Chelimsky Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Sunday, April 15, 2012 at 9:30 PM, Bas Vodde wrote:> > Hiya, > > Kewl, thanks! > > (To be honest, I was a bit disapointed as I was thinking of doing it myself and sending it to you :P) > > Anyways, much appreciated! > > Bas > > On 16-Apr-2012, at 10:14 AM, David Chelimsky wrote: > > > Actually I just went ahead and fixed it sans-bug report: https://github.com/rspec/rspec-mocks/commit/fb9c76c2e40b4b25f4dcc5de95f8c60319b6d9c1. It''ll be fixed in the next release (2.10). > > > > Cheers, > > David > > > > -- > > David Chelimsky > > Sent with Sparrow > > > > On Sunday, April 15, 2012 at 4:48 PM, David Chelimsky wrote: > > > > > On Sunday, April 15, 2012 at 1:32 AM, Bas Vodde wrote: > > > > > > > > Hiya all, > > > > > > > > I''ve got a quick question related to RSpec. I was test-driving some code and ended up in an endless loop. I was surprised by this, but traced it down to the mock not failing on additional calls but only in the end. Let me explain. > > > > > > > > I was writing code like this: > > > > > > > > subject.wrapper.should_receive(:window_list).exactly(4).times.and_return { > > > > counter = counter + 1 > > > > counter >= 4 ? [ "new window" ] : [] > > > > } > > > > > > > > The idea was that it would call the code-block 4 times exactly and then return a new value (and thus stop calling it). As the code to implement wasn''t there yet, it led to a recursive call. I had expected RSpec to stop after 4 calls though, as I had instructed the mock that I expected exactly 4 calls. > > > > > > > > I added a new test in RSpec itself in precision_counts_spec.rb: > > > > > > > > it "fails when a method is called more than n times, but fails within the method call" do > > > > @mock.should_receive(:random_call).exactly(1).times > > > > lambda do > > > > @mock.random_call > > > > @mock.random_call > > > > end.should raise_error(RSpec::Mocks::MockExpectationError) > > > > end > > > > > > > > which failed :( (or it failed to fail and therefore failed!) > > > > > > > > It would be nice if it would fail. Is there any reason for not failing already at this point in time? > > > > > > > > (I''m using RSpec 2.6-0. I quickly browsed the latest and didn''t see this changed) > > > > > > > > Thanks, > > > > > > > > Bas > > > There is no philosophical reason for this to happen, and there are other types of failures that do fail-fast (e.g. obj.should_receive(:bar).with(1,2) fails immediately if it receives :bar with any other args). > > > > > > Please submit this to https://github.com/rspec/rspec-mocks/issues and I''ll start looking into a fix. > > > > > > Cheers, > > > David > > > > > > > > > _______________________________________________ > > rspec-users mailing list > > rspec-users at rubyforge.org (mailto:rspec-users at rubyforge.org) > > http://rubyforge.org/mailman/listinfo/rspec-users > > > > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org (mailto:rspec-users at rubyforge.org) > http://rubyforge.org/mailman/listinfo/rspec-users > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20120415/3b696ffa/attachment.html>