Why doesn’t Rails generate a test file for each of your helpers for each of your
controllers? It should, I mean its code so you have to have tests for it. All
that talk you normally hear about helpers “well helpers really should have any
complicated code in them…etc.”, that’s great but it never works out that way.
So I decided to extend Rails’ controller generator to generate a helper test
file template. The template is based off of the “testing your helpers” template
found in Fowler’s Rails Recipes book. I know, the first time I saw it, I
thought it was a hack but don’t worry its held up nicely so far. I’ve been
using it on a couple of projects here at t-bot and our apps are that much
tighter. Now there are no excuses for committing code without tests (except for
views, but thats a whole other story I’m still working on). Attached is a .zip
containing the extensions. I wasn’t able to get this working as a plugin so for
the time being just drop it into your lib
directory. Your lib should look like
this:
lib
- controller_generator_extensions
- controller_generator.rb
- templates
controller.rb
functional_test.rb
helper.rb
helper_test.rb
view.rhtml
I’ve also included a tasks directory in the .zip. In here our 2 new tasks, drop
these 2 in lib/tasks
. One is called test_helpers.rake
, which adds a rake
task to run all your helper tests like so rake test:helpers
. The other is
redefining the default rake task test
to run your units, functionals, helpers,
then integration tests – basically the same as before but also includes your
helper tests.
You can run an individual helper test or an individual helper test method the same way you can w/ unit and functional tests, e.g.
ruby test/helper/users_helper_test.rb
ruby test/helper/users_helper_test.rb -n /link_to_user/
All helper tests are put in RAILS_ROOT/test/helper
.
One last thing, make sure to update your config/environment.rb
to load these
extensions like so:
require 'lib/controller_generator_extensions/controller_generator'
These extensions have worked fine with Rails 1.2.2 and Rails 1.2.3. I have run
into some strange bugs with some other versions of Rails this is due to instance
variable names being changed. In
lib/controller_generator_extensions/templates/helper_test.rb
, the following
line may need to be changed from
@controller.instance_eval { @_params = {}, @_request = request }
to
@controller.instance_eval { @params = {}, @request = request }
i.e. no underscores on the instance variables. As for writing your helper test
methods, anything that’s available normally in a helper (#link_to
, #h
, etc.)
is available in the helper test as well due to the various ActionView
modules
being included in. Enjoy.