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/

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to