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

David Chelimsky dchelimsky at gmail.com
Sat Aug 7 17:10:03 EDT 2010


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?

Cheers,
David






More information about the rspec-users mailing list