Good error messages are important to a library's usability.  Could we
find away to give the user a good error message when they override a
"reserved method"?

I'm thinking this could be accomplished with 2 simple pieces:

1. A method_added hook in Rspec-core that gives a warning or error
when a reserved method is overridden.
2. An API that allows libraries to add to the reserved methods list.

That way, rspec doesn't have to have knowledge of other libraries; it
would be the responsibility of other libraries to add their reserved
methods to the list.

Myron

On Aug 8, 9:13 am, Matt Wynne <m...@mattwynne.net> 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?
>
>
>
> > 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-us...@rubyforge.org
> >http://rubyforge.org/mailman/listinfo/rspec-users
>
> cheers,
> Matt
>
> http://blog.mattwynne.net+44(0)7974 430184
>
> _______________________________________________
> rspec-users mailing list
> rspec-us...@rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to