method_missing Hazardous to Your Module?
February 22, 2013
[object-oriented-design ]
[refactoring ]
[ruby ]
[testing ]
We built an(other) object factory module for our current project and it looks a lot like all the others: After a while, we noticed that the create methods were all exactly the same. Time for some dynamic refactoring!
Unfortunately, this leads to rather bizarre error messages during testing:
Failures:
1) MyHelper#filter returns an empty filter if there's nothing in the session
Failure/Error: not_my_method
NameError:
undefined local variable or method `not_my_method' for ...
# ./spec/support/object_creation_methods.rb:141:in `method_missing'
# ./spec/helpers/my_helper_spec.rb:14:in
We became our own enemy; Since we are including our module in RSpec for our tests, any missing method passed through our dynamic response method, with unfortunate, confusing results. Sad Panda.
There's a refactoring pattern, "Replace Dynamic Method Receptor with Dynamic Method Definition" which translates run time #method_missing into methods defined at load time. No more crazy stack traces!
Thank you! Jay Fields, et al.