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
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users

cheers,
Matt

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

_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to