David Chelimsky wrote:

         xpath :'legend[ contains(., "Personal Information") ]' and
         xpath :'label[ contains(., "First name") ]' and
         xpath :input, :type => 'text', :name => 'user[first_name]'

This is nice, but the abstractions are operating at different levels.
The keyword is "xpath" but the args passed to that look nothing like
xpath.

That's because it's a DSL. You can use raw XPath, XPath with one convenience (:'div[ @class = "content" ]' as a symbol implies "any descendant"), or you can use an option hash that generates XPath.

The DSL's benefit is tags like :attribute => foo will automatically escape their strings correctly. (That's why the top line of the diagnostic was a little cluttered!) foo could contain mixed ' and " payload, and we don't care.

> How about something like:

response.body.should be_xml_with do
  form :action => '/users' do
    fieldset do
      legend "Personal Information"
      label "First name"

Because I'm not webrat?

Yes it would be kewt if label('yo') went into method_missing and came out as //label[ contains(., "yo") ]. But I have found that spot checks of algorithmic details, such as eRB tags, are more valuable to development than slavishly matching your tests to your HTML contents.

If you write this HTML...

 <form blah>
    <input blah>
    <input blah>
    <input blah>
 </form>

...and if you test it with a sequence of assertions that exactly match it...

  page.should contain
    form blah
      input blah
      input blah
      input blah
    end
  end

...then you are not really doing TDD. You are merely replicating your code as your test, and that will only cause irritation at upgrade time or bug time.

Here's an example from our projects at work:

    get :thanks_for_purchasing
    assert_xpath :'center[ . = "Your order has been accepted!" ]'
    assert_xpath :div, :align => :center do
      a = assert_xpath(:'p[ contains(., "questions about your membership") ]/a')
      assert{ a.text == a[:href] }
      assert{ a[:href] == SubscriptionController::CUSTOMER_SERVICE_LINK }
    end

Note how much that specifies in the customer acknowledgment page.

 - the confirmation is centered
 - the explanation div is centered (yes, we could identify it better!)
 - part of the explanation div's contents contains "questions..."
 - next to the "questions..." is an <a>
 - the <a> contains an href matching its own text contents
 - the href links to our customer service system

I call this topic "XPath can see around corners":

http://www.oreillynet.com/onlamp/blog/2007/08/xpath_checker_and_assert_xpath.html

We are using XPath to pin down several elements in a page, allowing the other elements to change freely, but forcing them to maintain their correlations. That test would fail, for example, if the <a> somehow moved away from its introductory paragraph.

--
  Phlip
  http://www.zeroplayer.com/

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

Reply via email to