[rspec-users] Reflections on and questions about the describe/it syntax

Wincent Colaiuta win at wincent.com
Sat May 19 14:00:48 EDT 2007

I'm trying to wrap my head around the new describe/it syntax.

First, a few of observations:

- the "describe" word itself encourages you to think about contexts  
as things/nouns; this is reinforced by the way "script/generate  
rspec_model" and friends by default generate a template spec of the  
form "describe ClassName do ... end", because classes so often  
represent "things" (even if they are abstract things like relationships)

- the ability to follow a bare class name with a qualifying string --  
example: 'describe Stack, "(with one item)" do' -- further extends  
this pattern to encourage you to think of your contexts not only as  
"things", but as "things" with a certain state

- finally, the "it" syntax used for the examples, almost always  
followed by the word "should", encourages you to think about specific  
behaviours within the context, which I guess is what the goals of  
RSpec are all about

In many cases this works great and I have little trouble mapping the  
desired behaviours to the equivalent RSpec lingo. RSpec "steers" me  
towards writing specs along these lines:

- User (without a login name)
   - should be invalid
- User (with a non-unique login name)
   - should be invalid
- User (with login name less than three characters long)
   - should be invalid

But I start to feel uncomfortable with the repetition after a while,  
and I am not sure I am doing the right thing. What I really want to  
say is:

- User
   - should have a valid login name
     - login name should be present
     - login name should be unique
     - login name should be three or more characters long
     - etc

But if I start writing my specs like that I am getting further away  
from the one-spec-per-example ideal that some people argue for. Is  
this a bad thing? Which is clearer? "Clarity is king", after all. I  
also wonder about the difference between:

- User (with a login name containing a space)
   - should be invalid


- User
   - should be invalid if login name contains a space

Should I be trying to keep my "it" examples totally free of  
conditional language? (eg. "should be something if something"). I  
personally think the conditional form reads more clearly.

Basically, I am trying to go with the flow and work in the way that  
RSpec expects me to work. I figure if I do that then things will work  
out more easily for me. Words of wisdom, anyone?

Best wishes,

More information about the rspec-users mailing list