# Assert\_xhtml - test your HTML by example

**URL:** <https://www.ruby-forum.com/t/assert-xhtml-test-your-html-by-example/162627>\
**Category:** Ruby\
**Created:** [March 12, 2009, 6:00am UTC](https://www.ruby-forum.com/t/assert-xhtml-test-your-html-by-example/162627 "2009-03-12T06:00:40Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Phlip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/ed8c4c/32.png) [@Phlip](https://www.ruby-forum.com/u/Phlip)\
**Post date:** [March 12, 2009, 6:00am UTC](https://www.ruby-forum.com/t/assert-xhtml-test-your-html-by-example/162627/1 "2009-03-12T06:00:40Z")

</div>

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:

[An RSpec HTML matcher that nests contexts · GitHub](http://gist.github.com/76136)

Good hunting!

---

<div class="post-metadata">

**Author:** ![Phlip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/ed8c4c/32.png) [@Phlip](https://www.ruby-forum.com/u/Phlip)\
**Post date:** [March 12, 2009, 9:38pm UTC](https://www.ruby-forum.com/t/assert-xhtml-test-your-html-by-example/162627/2 "2009-03-12T21:38:30Z")

</div>

On Wed, Mar 11, 2009 at 11:58 PM, Phlip [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> assert\_xhtml do
> 
> When it fails, the assertion will print out your reference HTML, and your
> 
> ```
> li 'Billings report'
> 
> ```
> 
> block, so you must pass variables in as closures. And an element with the  
> [An RSpec HTML matcher that nests contexts · GitHub](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?

---

<div class="post-metadata">

**Author:** ![Phlip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/ed8c4c/32.png) [@Phlip](https://www.ruby-forum.com/u/Phlip)\
**Post date:** [March 12, 2009, 11:30pm UTC](https://www.ruby-forum.com/t/assert-xhtml-test-your-html-by-example/162627/3 "2009-03-12T23:30:38Z")

</div>

> > Those of you using RSpec will know how to apply this Gist:
> > 
> > [An RSpec HTML matcher that nests contexts · GitHub](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?

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!)

---

<div class="post-metadata">

**Author:** ![Phlip](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/ed8c4c/32.png) [@Phlip](https://www.ruby-forum.com/u/Phlip)\
**Post date:** [March 13, 2009, 10:11pm UTC](https://www.ruby-forum.com/t/assert-xhtml-test-your-html-by-example/162627/4 "2009-03-13T22:11:59Z")

</div>

Amazing stuff 😃  
Can’t wait to test it out
