[rspec-users] Name collision - how would you handle this?

Matt Wynne matt at mattwynne.net
Mon Aug 9 08:42:13 EDT 2010


On 9 Aug 2010, at 13:04, David Chelimsky wrote:

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

This is like an extremely sluggish kind of pair programming!

What do you think of it now? Is it growing on you? What worries you about it?

> 
>>> 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 at 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 at rubyforge.org
>>>> http://rubyforge.org/mailman/listinfo/rspec-users
>>> 
>>> _______________________________________________
>>> rspec-users mailing list
>>> rspec-users at 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 at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

cheers,
Matt

http://blog.mattwynne.net
+44(0)7974 430184



More information about the rspec-users mailing list