More Testing Goodness

So, some test helpers that we’ve been working on here at thoughtbot. Here’s what we’ve got going on for the models:

class ArticleTest < Test::Unit::TestCase
  should_belong_to :article_type
  should_have_and_belong_to_many :products
  should_have_one :image
  should_have_many :widgets, :through => :widgetization
  should_require_attributes :author, :title, :body

Pretty nice stuff, and it does away with about 50% of the tests we would normally write. But, the controllers are proving to be a bit more tenacious. We aren’t trying to be too ambitions—we really just want to deal with the most common restful controller actions. We want these tests to pretty much ensure that the controller “acts like a controller”. This way, any deviant behavior it may have will really stand out in the test file. This is what we have, so far.

class ArticlesControllerTest < Test::Unit::TestCase
  fixture :articles

  def setup
    @controller =
    @request    =
    @response   =

  should_post_to_create :item_params => { :title => "Blah",
                                          :body => 'super',
                                           :author => 'Someone'
                        :redirect_params => { :id => 'blah' }
  should_get_show :first
  should_get_edit :first
  should_put_to_update  :first, :item_params => { :title => "Blah" },
                                 :redirect_params => { :id => 'blah' }
  should_post_to_destroy :first

These test everything that the autogenerated scaffold file tests, and a bit more. They should deal with nested paths, and strange values from ar.to_param. I’m hoping that our loyal readers will give some insight in ways to simplify the calling signatures of the helpers. Also, let me know if you can’t tell what they do just from reading the code above. If you can’t, then the tests aren’t doing their job.

Pair with one of our expert developers to level up your skills with Coaching by thoughtbot. Save time learning best practices and techniques for reducing technical debt in Ember, Ruby, Haskell, and Go in 1-on-1 sessions tailored to your goals.