On Aug 9, 2010, at 6:37 AM, Matt Wynne wrote: > > On 9 Aug 2010, at 01:54, David Chelimsky wrote: > >> >> On Aug 8, 2010, at 11:13 AM, Matt Wynne wrote: >> >>> >>> On 8 Aug 2010, at 16:53, David Chelimsky wrote: >>> >>>> On Aug 8, 2010, at 10:40 AM, Matt Wynne wrote: >>>>> On 8 Aug 2010, at 16:38, David Chelimsky wrote: >>>>>> On Aug 7, 2010, at 4:10 PM, David Chelimsky wrote: >>>>>> >>>>>>> Hey all, >>>>>>> >>>>>>> It turns out that if you have >>>>>>> >>>>>>> * Rails (2 or 3) >>>>>>> * Ruby-1.9 >>>>>>> * a model named Message >>>>>>> * let(:message) or def message in an example group >>>>>>> * a Rails assertion in an example in that group >>>>>>> * note that rspec-rails' matchers delegate to Rails' assertions >>>>>>> >>>>>>> You'll get an error saying "wrong number of arguments (1 for 0)" >>>>>>> >>>>>>> This is because the rails assertion, which, when running with Ruby-1.9, >>>>>>> delegates to Minitest::Assertions#assert_block, which delegates to a >>>>>>> message() method that it defines. So the message() method defined by >>>>>>> let() overrides the message() method in the Assertions module, and >>>>>>> results in unexpected and undesirable outcomes. >>>>>>> >>>>>>> So - what should we do? I don't think changing Minitest is really an >>>>>>> option, as too many assertion libraries already wrap Minitest >>>>>>> assertions. I don't think RSpec should be in the business of monitoring >>>>>>> methods end-users define to make sure they're not overriding >>>>>>> pre-existing methods (what if you override a method intentionally?). >>>>>>> The only thing I'm left with is document this particular case and hope >>>>>>> for the best, but that feels unsatisfactory as well. >>>>>>> >>>>>>> Recommendations? Words of wisdom? >>>>>> >>>>>> FYI - here's the issue that spawned this thread: >>>>>> http://github.com/rspec/rspec-rails/issues/152 >>>>> >>>>> Can you use the Assertions module some other way than mixing it into the >>>>> example (thereby polluting it with the Assertions module's methods?) >>>> >>>> I like the idea in the abstract, but most of the rails assertions rely on >>>> some state that is local to the example (@response, @controller, @request, >>>> etc, etc). RSpec _could_ gather up all those instance variables and pass >>>> them into an assertion-wrapper object, but then it would be highly coupled >>>> to that implementation and would lead us down a familiar and unfriendly >>>> path of forcing rspec-rails releases for every rails release. That's a >>>> world I hope to leave behind with Rails 3 :) >>> >>> So leave the rails assertions mixed into the example, but forward all the >>> calls to the MiniTest::Assertions methods to some other object that has >>> them mixed in. Won't that work? >> >> Here's a prototype implementation: >> http://github.com/rspec/rspec-rails/commit/0cd384536cf532435ec8f290a9c357b60872acd7 >> >> It's on a branch >> (http://github.com/rspec/rspec-rails/tree/assertion-delegate) because I'm >> not convinced this is the right way to go yet, but I'd like some feedback >> from anyone who wishes to peruse and comment. > > Yeah, that's what I was talking about. Couple of thoughts / questions: > > I'm still not clear why you need to copy the instance variable over though - > do the rails assertions get monkey-patched into the Test::Unit::Assertions > module then?
No - holdover from exploratory session. > Also, how come there's nothing in the specs about the #message method that > caused all this? Good point. New patch: http://github.com/rspec/rspec-rails/commit/86600313462638e7becc726e53f1bc67af108667 >> Thanks, >> David >> >>>> It would also eliminate the option to use the Rails assertions directly in >>>> examples. >>>> >>>> Oh, well :) >>>> >>>>> cheers, >>>>> Matt >>>>> >>>>> http://blog.mattwynne.net >>>>> +44(0)7974 430184 >>>> >>>> _______________________________________________ >>>> rspec-users mailing list >>>> rspec-users@rubyforge.org >>>> http://rubyforge.org/mailman/listinfo/rspec-users >>> >>> cheers, >>> Matt >>> >>> http://blog.mattwynne.net >>> +44(0)7974 430184 >>> >>> _______________________________________________ >>> rspec-users mailing list >>> rspec-users@rubyforge.org >>> http://rubyforge.org/mailman/listinfo/rspec-users >> >> _______________________________________________ >> rspec-users mailing list >> rspec-users@rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users > > cheers, > Matt > > http://blog.mattwynne.net > +44(0)7974 430184 > > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users