[rspec-users] validate_presence_of

Mike Gaffney mr.gaffo at gmail.com
Thu Feb 19 10:00:46 EST 2009


Dave, you make a good point. In our system, where we are converting a 
legacy database/application, we typically have no user stories and have 
the technical (or you could argue user) requirement that the database 
logic / constraints get converted. This is where we are typically just 
encoding all of the should_have_many, etcs. They at a first glance do 
seem like fragile and redundant tests but when you consider that the 
schema isn't in rails standard format, simple has_manys are not always 
going to work so we actually need to test our configuration of the 
associations.

-Mike

David Chelimsky wrote:
> On Wed, Feb 18, 2009 at 11:31 PM, Stephen Eley <sfeley at gmail.com> wrote:
>   
>> On Wed, Feb 18, 2009 at 10:42 PM, Mark Wilden <mark at mwilden.com> wrote:
>>     
>>> On Wed, Feb 18, 2009 at 4:39 PM, Fernando Perez <lists at ruby-forum.com> wrote:
>>>       
>>>> What's the point in testing validates_presence_of for a model?
>>>>         
>>> To make sure you wrote that line of code.
>>>       
>> And the circle spins round and round...
>>
>> Specs that mirror the code that closely are a bad idea, I think.  The
>> problem with that example is that the syntax of the code is driving
>> the syntax of the spec, even if the spec was written first.  You're no
>> longer thinking about high-level behavior, you're thinking about the
>> presence of a certain line in Rails.
>>
>> I write those sorts of model specs a little differently.  I just poke
>> at things and set expectations on whether they break.  I'd write this
>> example like:
>>
>> describe User do
>>  before(:each) do
>>    @this = User.make_unsaved   # I use machinist for my factory methods
>>  end
>>
>>  it "is valid" do
>>    @this.should be_valid
>>  end
>>
>>  it "can save" do
>>    @this.save.should be_true
>>  end
>>
>>  it "requires a login" do
>>    @this.login = nil
>>    @this.should_not be_valid
>>  end
>>
>>  it "may have a password reminder" do
>>    @this.password_reminder = nil
>>    @this.should be_valid
>>  end
>>
>>  it "does not allow duplicate logins" do
>>    @that = User.make(:login => "EvilTwin")
>>    @this.login = "EvilTwin"
>>    @this.should_not be_valid
>>  end
>> end
>>
>> ...And so forth.  It's wordier, but very readable, and it doesn't rely
>> on the validation being done with a specific Rails method.  In fact,
>> when I shifted to using Merb and Datamapper, I didn't have to change
>> these sorts of tests at all.
>>     
>
> That's huge!
>
>   
>> Also, while I used to be very anal and write "should
>> have(1).error_on(:login)" and such, I eventually realized that there's
>> no point.  Checking on 'valid?' is entire and sufficient.  The first
>> example proves that the default factory case is valid, so as long as
>> we're only changing one thing at a time, we know that that's the thing
>> that breaks validity.  (Or, in the case of "may have," *doesn't* break
>> validity.)
>>     
>
> I think this depends on whether or not error messages are part of the
> conversation w/ the customer. If not, that seems fine.
>
> I find that I'll spec validations directly, but not associations.
> There's no need to say that a team has_many players when you have
> examples like team.should have(9).players_on_the_field.
>
> But my validation specs do tend to be closely tied to AR methods like
> valid?(), which, as your example suggests, is impeding my ability to
> choose a different ORM lib. Time for some re-thinking!
>
> Cheers,
> David
>
>   
>> --
>> Have Fun,
>>   Steve Eley (sfeley at gmail.com)
>>   ESCAPE POD - The Science Fiction Podcast Magazine
>>   http://www.escapepod.org
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>>
>>     
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>   

-- 
-Mike Gaffney (http://rdocul.us)



More information about the rspec-users mailing list