I am trying to test a rails app using webrat. I have this sort of construct:
<table id="entities" caption="Entity Listing" ...>
<thead> <tr> <th style="width:20em;">Short Name</th> ... </tr> <tr> <th colspan="2">Legal Name</th> </tr> </thead>
<tbody>
<% for entity in @entities %> <tr id="<%=dom_id(entity, :list)%>"> <td><%=h entity.entity_name.titlecase -%></td> ... <td id="<%=dom_id(entity, :show)%>"> <%= link_to 'Show Entity', entity -%></td> <td id="<%=dom_id(entity, :edit)%>"> <%= link_to 'Edit Entity', edit_entity_path(entity) -%></td> <td id="<%=dom_id(entity, :delete)%>"> <%= link_to 'Destroy Entity', entity, :confirm => 'Are you sure?', :method => :delete -%></td> </tr>
I am trying to test the destroy link using this webrat code:
my_entity = Entity.find_by_entity_name( "my entity number #{row.hll_words_to_i}") within("body > table > tbody > tr#" + dom_id(my_entity, :list) + " > td#" + dom_id(my_entity, :delete)) do click_link "Destroy Entity" end
This fails with a nil exception error:
You have a nil object when you didn't expect it! The error occurred while evaluating nil.to_html (NoMethodError) /usr/lib64/ruby/gems/1.8/gems/webrat-0.3.4/lib/webrat/core/scope.rb:176:in `scoped_dom' ...
I have tried with other variants of the selector. If I check for the selector using have_selector("td#" + dom_id(my_entity, :delete)) then it passes. If I use the long form above it also passes. I test for a missing selector then have_selector fails as expected. Therefore, I am reasonably certain that the selector is indeed being found on the page.
Any ideas as to what I am doing wrong?