https://github.com/pd/rspec_hpricot_matchers
have_tag() without Rails' assert_select()
https://github.com/pd/rspec_hpricot_matchers
Last synced: about 1 year ago
JSON representation
have_tag() without Rails' assert_select()
- Host: GitHub
- URL: https://github.com/pd/rspec_hpricot_matchers
- Owner: pd
- License: mit
- Created: 2008-02-29T22:54:51.000Z (over 18 years ago)
- Default Branch: master
- Last Pushed: 2009-06-10T04:03:26.000Z (about 17 years ago)
- Last Synced: 2024-04-16T00:58:49.627Z (about 2 years ago)
- Language: Ruby
- Homepage:
- Size: 105 KB
- Stars: 29
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README
- License: MIT-LICENSE
Awesome Lists containing this project
README
= rspec_hpricot_matchers
An implementation of have_tag(), as in rspec_on_rails, but sitting atop
Nokogiri rather than merely wrapping assert_select().
So at one point it was on Hpricot. But it's not now. Misnomers are more
fun. You're probably better off using something like Webrat::Matchers
anyhow.
== Installation
To use rspec_hpricot_matchers in your project, install the gem, and
add the following to your spec_helper.rb file:
require 'rspec_hpricot_matchers'
Spec::Runner.configure do |config|
config.include(RspecHpricotMatchers)
end
Similarly, to make the matchers available to stories, you can add the
following to your stories/helper.rb file:
require 'rspec_hpricot_matchers'
include RspecHpricotMatchers
== Usage
As its first argument, have_tag() accepts any CSS or XPath selectors
which are supported by Hpricot.
body.should have_tag('form[@action*=session]')
body.should have_tag('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:
body.should have_tag('h1', 'Welcome')
body.should have_tag('p', /a very important blurb/i)
Expectations can be placed upon the number of matched elements by
passing an options hash:
body.should have_tag('abbr', :count => 1) # exactly one
body.should have_tag('dt', :minimum => 4) # at least 4
body.should have_tag('dd', :maximum => 4) # at most 4
body.should have_tag('a.outgoing', /rspec/i, :count => 2)
The :count key also accepts a Range, making the following equivalent:
body.should have_tag('tr', :count => 3..5)
body.should have_tag('tr', :minimum => 3,
:maximum => 5)
The usage of with_tag(), however, is no longer supported. Instead, a
block passed to have_tag() will have each matched element successively
yielded to it. If none of the blocks return without raising an
ExpectationNotMetError, the outer have_tag() is treated as having failed:
body.should have_tag('thead') do |thead|
thead.should have_tag('th', :count => 5)
end
This also allows arbitrary expectations to be applied from within
the block, such as:
body.should have_tag('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:
body.should have_tag('li[class=?]', dom_class)
body.should have_tag('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 have_tag() further differs from the assert_select-based
implementation in that the nested have_tag() 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.