From: David Chelimsky Date: 2009-03-13T05:35:42+09:00 Subject: Re: [ANN] assert_xhtml - test your HTML by example On Wed, Mar 11, 2009 at 11:58 PM, Phlip wrote: > Rubies: > > My quest to get the maximum coverage & diagnostics from the leanest possible > tests has reached a new level. > > This is a Rails functional test on an HTML form: > >    user = users(:Moses) >    get :edit_user, :id => user.id > >    assert_xhtml do > >      form :action => '/users' do >        fieldset do >          legend 'Personal Information' >          label 'First name' >          input :type => 'text', >                :name => 'user[first_name]' >                :value => user.first_name >        end >      end > >    end > > That's all. The assertion expects a form with a given action, containing a > fieldset, a legend, a label, and a populated text input field. The assertion > forgives any other details, such as intervening structural tags, and > complains if any required detail is missing, out of order, or ill-formed. > > You test HTML by writing an example of what you expect, excluding details > you don't care about. > > When it fails, the assertion will print out your reference HTML, and your > sample HTML from your web page. > > The assertion faults if... > >  - any attribute does not match exactly >  - any text content does not match, stripped >  - any node is not found at all >  - any node is found out of order > > The assertion does not fail if > >  - nodes contain un-specified attributes >  - the DOM contains any un-specified tags (,
, etc.) > > Here's the assertion checking that a list appears in collating order: > >    assert_xhtml SAMPLE_LIST do > >      ul :style => 'font-size: 18' do >        li 'model' do >          li 'Billings criteria' >          li 'Billings report' >          li 'Sales report' >        end >      end > >    end > > The assertion takes a block that renders into a Nokogiri::HTML::Builder. Any > HTML it can build, you can specify by example. > > That freedom causes two issues: The 'self' context is different inside this > block, so you must pass variables in as closures. And an element with the > same name as a Builder method, such as .select, need a bang: .select! > > Get the assertion, from assert2-0.3.8.gem, with these incantations: > >  gem install assert2 nokogiri > >  require 'assert2/xhtml'  #  for Test::Unit::TestCase and derivatives > > Those of you using RSpec will know how to apply this Gist: > >  http://gist.github.com/76136 Any interest in just incorporating this into the lib? So an RSpec user could say "require 'assert2/rspec'" or something? > > Good hunting! > > -- >  Phlip >  http://www.zeroplayer.com/ > >