[ANN] assert_xhtml - test your HTML by example

P

Phlip

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 (<html>, <div>, 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

Good hunting!
 
D

David Chelimsky

Rubies:

My quest to get the maximum coverage & diagnostics from the leanest possi= ble
tests has reached a new level.

This is a Rails functional test on an HTML form:

=A0 =A0user =3D users:)Moses)
=A0 =A0get :edit_user, :id =3D> user.id

=A0 =A0assert_xhtml do

=A0 =A0 =A0form :action =3D> '/users' do
=A0 =A0 =A0 =A0fieldset do
=A0 =A0 =A0 =A0 =A0legend 'Personal Information'
=A0 =A0 =A0 =A0 =A0label 'First name'
=A0 =A0 =A0 =A0 =A0input :type =3D> 'text',
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0:name =3D> 'user[first_name]'
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0:value =3D> user.first_name
=A0 =A0 =A0 =A0end
=A0 =A0 =A0end

=A0 =A0end

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 assert= ion
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...

=A0- any attribute does not match exactly
=A0- any text content does not match, stripped
=A0- any node is not found at all
=A0- any node is found out of order

The assertion does not fail if

=A0- nodes contain un-specified attributes
=A0- the DOM contains any un-specified tags (<html>, <div>, etc.)

Here's the assertion checking that a list appears in collating order:

=A0 =A0assert_xhtml SAMPLE_LIST do

=A0 =A0 =A0ul :style =3D> 'font-size: 18' do
=A0 =A0 =A0 =A0li 'model' do
=A0 =A0 =A0 =A0 =A0li 'Billings criteria'
=A0 =A0 =A0 =A0 =A0li 'Billings report'
=A0 =A0 =A0 =A0 =A0li 'Sales report'
=A0 =A0 =A0 =A0end
=A0 =A0 =A0end

=A0 =A0end

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 th= is
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:

=A0gem install assert2 nokogiri

=A0require 'assert2/xhtml' =A0# =A0for Test::Unit::TestCase and derivativ= es

Those of you using RSpec will know how to apply this Gist:

=A0http://gist.github.com/76136

Any interest in just incorporating this into the lib? So an RSpec user
could say "require 'assert2/rspec'" or something?
 
P

Phlip

Those of you using RSpec will know how to apply this Gist:
Any interest in just incorporating this into the lib? So an RSpec user
could say "require 'assert2/rspec'" or something?

Yabsolutely!

And my boss just hit the "crunch mode" button today, after 2 years of pure
sustainable pace. Guess it's time to pay out the energy we have stored up, huh?

(No RSpec onsite. Sorry!)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top