Navigation Menu

Skip to content

collectiveidea/rspec_hpricot_matchers

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

= 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.

About

have_tag() without Rails' assert_select()

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 100.0%