[rspec-users] [ANN] assert2/xhtml specifies your HTML by example

Phlip phlip2005 at gmail.com
Sun Mar 15 23:39:43 EDT 2009



Rubies:

assert_xhtml now works with RSpec. (Call it ".should be_html_with{}" !)

This is its Rails functional test aspect:

     get :edit_user, :id => users(:Moses).id
     scope = self

     assert_xhtml do
       form :action => '/users' do
         fieldset do
           legend 'Personal Information'
           label 'First name'
           input :type => 'text',
                 :name => 'user[first_name]'
                 :value => scope.users(:Moses).first_name
         end
       end
     end

The assertion tests your form "by example". Your page must contain a form with 
the given action, and it must contain at least the listed elements, attributes, 
and text. Anything you don't care about - anything your designers might change - 
you simply leave out of the example.

(The example is actually Nokogiri::HTML::Builder notation, so anything Nokogiri 
can do, the assertion can do. But that's why we needed that 'scope' variable, as 
a kind of "messenger rope", to call your test-side methods inside the block. 
Otherwise, Nokogiri would dutifully convert them into HTML!)

Here's a similar test, in RSpec:

   it 'should have a cute form' do
     render '/users/new'

     response.body.should be_html_with{
       form :action => '/users' do
         fieldset do
           legend 'Personal Information'
           label 'First nome'
           input :type => 'text', :name => 'user[first_name]'
         end
       end
     }
   end

Oh, except it has a bug in it! Here's the diagnostic:

'/users/new should have a cute form' FAILED

Could not find this reference...

<form action="/users">
   <fieldset>
   <legend>Personal Information</legend>
   <label>First nome</label>
   <input type="text" name="user[first_name]">
</fieldset></form>

...in these sample(s)...

<form action="/users">
   <fieldset>
     <legend>Personal Information</legend>
     <ol>
       <li id="control_user_first_name">
         <label for="user_first_name">First name</label>
         <input type="text" name="user[first_name]" id="user_first_name">
        </li>
     </ol>
   </fieldset>
</form>

Notice, as usual, the specification diagnostic only contained the start of the 
match. The example with <form action="/users"> worked.

That's all there is to it. Write anything you like inside the block, and if the 
assertion can't find it, it will explain why it can't. Install the gem like this:

   gem install nokogiri assert2  #  make sure the later is 0.3.9!

Then use require 'assert2/xhtml', in either the test/unit or RSpec environments.

This project is wide-open for suggestions - with < 200 lines of code there's 
plenty of room for more features!

-- 
   Phlip
   http://www.zeroplayer.com/



More information about the rspec-users mailing list