[rspec-users] be_valid (validates_format_of ..., :on => :create)

Bart Zonneveld zuperinfinite at gmail.com
Mon Mar 2 11:23:08 EST 2009


On 2-mrt-2009, at 16:50, David Chelimsky wrote:

> On Mon, Mar 2, 2009 at 8:20 AM, Bart Zonneveld  
> <zuperinfinite at gmail.com> wrote:
>>
>> On 28-feb-2009, at 11:45, MAwiniarski wrote:
>>
>>> Greetings,
>>>
>>> How to write Example which will check if model's variable's
>>> format is valid using :on => :create, like this:
>>>
>>> class User < ActiveRecord::Base
>>> ...
>>>  validates_format_of       :email, :with => /.../, :on => :create
>>> ...
>>>
>>> Using following code is not right:
>>> it "should ..." do
>>>   @user = users(:example_user)
>>>   @user.email = 'invalid_email_format'
>>>   @user.save
>>>   @user.should_not be_valid
>>> end
>>
>> Try:
>>
>> it "should ..." do
>>   user = User.new # create a NEW user, instead of loading an  
>> already saved
>> user from a fixtures file
>>   user.email = 'invalid_email_format'
>>   user.should_not be_valid
>>   user.should have(1).errors_on(:email)
>> end
>
> +1
>
> I might combine the first two lines:
>
>   user = User.create(:email => "invalid_email_format")
>
> That reads more clearly to me because the invalid email format is
> assigned on create, not after. It would have an extra call to valid?
> but I think it's worth it for the clarity of intent in this case.

Although I agree with the reasoning you display here, I'd *never*  
validate any attribute just on create.
I'm pretty sure a user can update his email address somewhere in the  
site, but then his email address wouldn't be validated anymore.

On a second note, I noticed rspec default generated model specs now  
use Model.create!(@valid_attributes) as their default "all is valid"  
test. What's the advantage of this approach? I just write  
@model.attributes = @valid_attributes; @model.should be_valid, to  
prevent these specs to actually hit the db, and therefore speed up my  
specs a bit.

thanks,
bartz



More information about the rspec-users mailing list