Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
have_tag() without Rails' assert_select()
Ruby
branch: master

This branch is 2 commits ahead, 8 commits behind btakita:master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
spec
.gitignore
MIT-LICENSE
README
Rakefile

README

= rspec_hpricot_matchers

A matcher similar to RSpec's +#have_tag+ sitting atop Hpricot rather than
wrapping +#assert_select+.

== Usage

Include RspecHpricotMatchers in your +spec_helper+:

    Spec::Runner.configure do |config|
      config.include RspecHpricotMatchers
    end

As its first argument, match_element() accepts any CSS or XPath selectors
which are supported by Hpricot.

    response.should match_element('form[@action*=session]')
    response.should match_element('ul > li + li')

Expectations can be placed upon the inner text of the matched element
by providing another argument, which should be either a String or a
Regexp:

    response.should match_element('h1', 'Welcome')
    response.should match_element('p', /a very important blurb/i)

Expectations can be placed upon the number of matched elements by
passing an options hash:

    response.should match_element('abbr', :count => 1)   # exactly one
    response.should match_element('dt',   :minimum => 4) # at least 4
    response.should match_element('dd',   :maximum => 4) # at most 4
    response.should match_element('a.outgoing', /rspec/i, :count => 2)

The :count key also accepts a Range, making the following equivalent:

    response.should match_element('tr',   :count => 3..5)
    response.should match_element('tr',   :minimum => 3,
                                 :maximum => 5)


A block can be passed to #match_element to search for elements within the
matched element:

    response.should match_element('thead') do |thead|
      thead.should match_element('th', :count => 5)
    end

This also allows arbitrary expectations to be applied from within
the block, such as:

    response.should match_element('dl dd.sha1') do |dd|
      dd.inner_text.length.should == 40
    end

== Notes

Currently, this implementation does not support substitution values
as assert_select did (by way of HTML::Selector):

    # Not yet supported:
    response.should match_element('li[class=?]', dom_class)
    response.should match_element('tr.person#?', /^person-\d+$/)

I personally rarely use these, and Hpricot's advanced selectors make
them mostly useless, as far as I can tell, so I am unlikely to
implement them myself.

This match_element() further differs from the assert_select-based
implementation in that the nested match_element() calls must *all* pass
on a single selected element in order to be true. This was a source
of confusion in RSpec ticket #316. There is a spec covering this
case if you need an example.
Something went wrong with that request. Please try again.