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:
should ensure_length_of(:my_integer).integer_field.is_equal_to(4)
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
No comments:
Post a Comment