[rspec-users] Ordering in view specs using have_tag and with_tag

Wincent Colaiuta win at wincent.com
Thu May 24 10:56:16 EDT 2007

El 24/5/2007, a las 16:24, Matt Deiters escribió:

> A couple of questions/comments. Are you doing some sorting logic in  
> the view? If so I can see why you would want to assert order, but  
> perhaps it would be better to move that type of logic out of view  
> and into your controller (or perhaps a presenter or helper). Then  
> you would test the order of your collection in one of those (helper/ 
> controller) types of specs. Then your view would just iterate of  
> the collection and if your view is just iterating over the  
> collection, then when your testing order you would really be  
> testing does 'ruby iterate right', which again is something we  
> don't want to test in our views (or need test at all).

No, the view has no sorting logic:

<% for user in @users %>
<div id="userlist">
   <div class="<%= cycle('odd', 'even') %>">
     <div class="label">Login name:</div>
     <div class="info"><%=h user.login_name %></div>
     <div class="label">Display name:</div>
     <div class="info"><%=h user.display_name %></div>
     <div class="label">Email address:</div>
     <div class="info"><%=h user.email_address %></div>
<% end %>

But I do want to be sure of some things, and these stemmed out of  
behaviour-driving the development of the view. I basically imagined  
what I wanted the view to look like in my mind and started coming up  
with specifications:

- users should be listed in rows
- rows should have alternate classes (odd, even, odd, even) so they  
can be visually styled
- there should be three fields for each user
- the fields should appear in order: login name, display name, email  
- each field should be preceded by the correct, corresponding label
- users should appear in the view in the order that they were passed  
to it
- etc

So when I wrote the view based on the specs. I was dismayed to find  
that if I ignored the question of ordering then I could radically  
change the view and the specs would still pass, even though I the  
view no longer resembled what I wanted it to look like in my mind...  
Basically, I want to be able to assert that "rows should be odd,  
even" and only "odd, even" should pass, not "even, odd". Likewise, I  
want to be able to assert "header, content, footer" and not accept  
results like "footer, header, content" etc.

In the case where order doesn't matter at all and you only want to  
test for the presence of something on the page, you can easily do  
that with a single "have_tag" inside an example "it" block of its own.


More information about the rspec-users mailing list