validate_format_of is almost always called more than once on a single fieldname. Generally with different valid formats... and then with different invalid formats.
eg our set of date-format validations:
# validate_our_date_format(:end_date, "Please enter correct format for end date") def self.validate_our_date_format(field_name,msg) # /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/ # dates we do match and should should validate_format_of(field_name).with('01/04/2010').with_message(msg) should validate_format_of(field_name).with('31/12/2012').with_message(msg) should validate_format_of(field_name).with(' 03/08/2010 ').with_message(msg) should validate_format_of(field_name).with('01/02/12').with_message(msg) should validate_format_of(field_name).with('02-01-2010').with_message(msg) should validate_format_of(field_name).with('1/2/2012').with_message(msg) should validate_format_of(field_name).with("04/10/2011\t\n").with_message(msg) # dates we don't match and shouldn't should validate_format_of(field_name).not_with('42/99/9999').with_message(msg) should validate_format_of(field_name).not_with('00/00/0000').with_message(msg) should validate_format_of(field_name).not_with('1').with_message(msg) should validate_format_of(field_name).not_with('abcd').with_message(msg) should validate_format_of(field_name).not_with('01/02/silly').with_message(msg) end
but there's a bug in validates_format_of... the description (which becomes the test name) is based on the following code: "{attribute} have a valid format" which makes tests named eg: "should :end_date have a valid format"... These test names are identical, not very useful, and not even properly grammatical.
*ALL* of them are named this eg, in the above example I'd have 12 tests all named as above...
At best, this identical-ness causes scads of Giant Flaming WARNINGS saying that
WARNING: 'test: <your enclosing scope here> should <fieldname> have a valid format.' is already defined
At worst, in certain (old) versions of rails - this means that only the first one gets run at all!
So - uniquifying the name is a Good Thing
The non-usefulness is that even if they do run, you don't know *which* version of your validates_format_of failed... because they're all named the same thing.
Thus this monkey-patch, which puts such things as the test-string *in the description*.
As with my previous shoulda backports, add these to a file in the config/initializers directory
module Shoulda # :nodoc: module ActiveRecord module Matchers # uniquify the description for validates_format_of "should" tests class NewValidateFormatOfMatcher < ValidateFormatOfMatcher # put a little more detail into the description def description if @value_to_fail "not accept #{@value_to_fail} as a valid format for #{@attribute}" elsif @value_to_pass "accept #{@value_to_pass} as a valid format for #{@attribute}" else super end end end # and override validate_format_of to use our new class def validate_format_of(attr) NewValidateFormatOfMatcher.new(attr) end end end end
Note: this monkeypatch is for shoulda version 2.11.1 - not the latest Rails 3 version. You may need to modify accordingly if you're actually up-to-date...
No comments:
Post a Comment