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 :) 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