We're still using Rails 2.3.X and therefore are stuck with thoughtbot-shoulda version 2.11.1 Which unfortunately doesn't come with a lot of the niceties of the most recent version. We've pulled some backports into our initializers directory to bring it up to speed - notably the ability to deal with foreign keys on association-definitions (see below).
But there's one small thing that has always annoyed me about shoulda - and isn't in any version.
That's the ability for ensure_length_of (the validates_length_of macro) to handle integer fields. Active Record can deal with it... therefore shoulda should too.
It's a tiny hack, but I'm currently too lazy to fork shoulda and write the tests to make it a viable pull-request, but here's a monkeypatch that'll get it working for you.
Save it into something like: config/initializers/shoulda_monkeypatches.rb, then use it like this:
module Shoulda # :nodoc: module ActiveRecord module Matchers # I don't like it that ensure length of only works for strings. # This patch makes it also work for integers if we want class NewEnsureLengthOfMatcher < EnsureLengthOfMatcher def integer_field @integer_field = true self end # re-write "string_of_length" to make the string an int-string def string_of_length(length) if @integer_field '1' * length # yep, this works for an int field else 'x' * length end end end # and override ensure_length_of to use our new class def ensure_length_of(attr) NewEnsureLengthOfMatcher.new(attr) end end end end
Oh, and for the foreign-key backport:
module Shoulda # :nodoc: module Matchers module ActiveRecord # use the actual foreign key for an association class AssociationMatcher def foreign_key if foreign_key_reflection if foreign_key_reflection.respond_to?(:foreign_key) foreign_key_reflection.foreign_key.to_s else foreign_key_reflection.primary_key_name.to_s end end end end end end end