[ANN] assert2/xhtml specifies your HTML by example

P

Phlip

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!
 

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,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top