On May 27, 2010, at 8:39 AM, Nadal wrote:

> Thanks David for great explanation.
> 
> Just to be clear to David and others. As some of you might have
> noticed I have been asking a lot of questions starting last week. And
> that is because I never used rspec before. And now that I am reading
> the book and am trying to convert some of my tests from plain ruby
> style tests to rspec I am trying to engage in a conversation.
> 
> No offense to anyone.

No offense taken, and I apologize that my response appeared to direct negative 
energy your way. You just touched on a topic that I feel strongly about. DRY is 
widely misunderstood and oft misappropriated at the expense of other valuable 
principles that should be considered as well.

> Infact I salute David and other team members.
> It's just that I am being more vocal and bringing a perspective to the
> community. And ,I believe, if I have a question then others might have
> similar question and they might not take time to write in the forum.

Absolutely!

> Either way I am learning a lot and I hope community benefits. The book
> is great. And conversations like this one with real example makes for
> great supplement.

Absolutely, again! Bring on the questions.

Cheers,
David

> On May 27, 2:44 am, Matt Wynne <m...@mattwynne.net> wrote:
>> On 27 May 2010, at 04:44, David Chelimsky wrote:
>> 
>> 
>> 
>> 
>> 
>>> On May 26, 2010, at 9:37 PM, Nadal wrote:
>> 
>>>> Here is my spec.
>> 
>>>> describe Exception2db do
>>>> context "attributes" do
>>>>   subject { Exception2db.create(:exception => $exception_data_xml) }
>> 
>>>>   specify { subject.controller.should == 'exception2db/main' }
>>>>   specify { subject.error_message.should == 'RuntimeError: 46' }
>>>>   specify { subject.user_agent.should == "Mozilla/5.0 (Macintosh; U;
>>>> Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko)
>>>> Chrome/5.0.375.38 Safari/533.4" }
>>>> end
>>>> end
>> 
>>>> Here is specdoc.
>> 
>>>> Exception2db attributes
>>>> - should == "exception2db/main"
>>>> - should == "RuntimeError: 46"
>>>> - should == "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US)
>>>> AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.38 Safari/533.4"
>> 
>>>> All the tests are passing. However the specdoc message is not very
>>>> clean.
>> 
>>>> How can I improve the message? What am I missing? The idea of wrapping
>>>> each of my specify inside "it" to just to have better message is not
>>>> very DRY.
>> 
>>> I look at it the other way: accepting unclear messages just to keep things 
>>> DRY is missing the point.
>> 
>>> DRY is about reducing duplication of concepts, not letters. At its heart, 
>>> DRY is about maintenance. Duplication can come in very sinister forms, like 
>>> two methods with different names on two different objects that accomplish 
>>> the same task. That's the sort of duplication that kills maintenance 
>>> because a new requirement comes in and you don't even realize you have two 
>>> places to change in the code base.
>> 
>>> Consider the following two examples:
>> 
>>> it "concats the first and last name" do
>>>  first_name = "David"
>>>  last_name = "Chelimsky"
>>>  person = Person.new(
>>>    :first_name => first_name,
>>>    :last_name => last_name
>>>  )
>>>  person.full_name.should == "#{first_name} #{last_name}"
>>> end
>> 
>>> it "concats the first and last name" do
>>>  person = Person.new(
>>>    :first_name => "David",
>>>    :last_name => "Chelimsky"
>>>  )
>>>  person.full_name.should == "David Chelimsky"
>>> end
>> 
>>> Which one is DRYer? You could argue the first one is, because the string 
>>> literals are not repeated. You could argue that the second one is, because 
>>> the variable names are not repeated. You might argue the first one is 
>>> because, even though the variable names are repeated, the failure message 
>>> you get if you type "frist_name" will be very informative. You might argue 
>>> that typing "Chelmisky" in the second one would also give you an 
>>> informative message. Also, the first one very likely duplicates the actual 
>>> implementation of the full_name method. And on, and on, and on, and on.
>> 
>>> Here's what I don't really think you can argue against: the second one is 
>>> easier to read and understand.
>> 
>>> In the example you gave, I have absolutely no idea what those specs are 
>>> telling me about the Exception2db object. After some study, I _think_ I 
>>> understand, but it took a minute. What I'd like to see in the specdoc 
>>> output is something like:
>> 
>>> Exception2db
>>>  stores the controller
>>>  stores the runtime error
>>>  stores the user agent
>> 
>>> Now I know what this thing DOES. Sure, the spec is going to have more lines 
>>> in it, but the concepts expressed in the specdoc are _different_ from the 
>>> concepts in the expectations. In my book, that's not a DRY violation at all.
>> 
>>> HTH,
>>> David
>> 
>>> ps - there is some irony in the fact that I keep repeating myself on this 
>>> exact topic on this list. I think I need to write this up in a blog post 
>>> and point people to that in the future. Now THAT would be DRY.
>> 
>> Great explanation David.
>> 
>> There's a slightly different point about this, which is that in the BDD 
>> world we aspire to build things from the "outside in".
>> 
>> These splendid methods that automatically generate specdoc from code are 
>> great in simple cases, but very often it's advisable to start by writing a 
>> plain-english description of what you're setting out to do before you write 
>> any code. Jumping straight in to writing the code (the solution) without 
>> clearly having stated the goal can mean you miss a chance to get insights 
>> into your design.
>> 
>> cheers,
>> Matthttp://blog.mattwynne.net
>> _______________________________________________
>> rspec-users mailing list
>> rspec-us...@rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to