Minitest::HaveTag
Coverage: 100%
Adds methods to Minitest to test for existence of HTML tags, including contents, within a provided string.
Installation
Add this gem to your application's Gemfile:
gem 'minitest-have_tag'And then execute bundle install.
Or install it yourself with:
gem install minitest-have_tagUsage
Setup
Add the gem in your spec/spec_helper.rb file after the 'minitest/autorun' gem to automatically
add the assertion methods.
require 'minitest/autorun'
require 'minitest/have_tag'
# ...Usage with default assertions
class MyTest < Minitest::Test
def test_basic_html_tag
html = '<br>'
assert_have_tag(html, 'br')
end
def test_basic_html_attributes
html = '<div id="header" class="flex"></div>'
# CSS class paths
assert_have_tag(html, 'div.flex')
assert_have_tag(html, 'div[@class=flex]')
assert_have_tag(html, 'div#header')
end
# check for contents within a <div...>
def test_basic_html_tag_contents
html = '<div class="row">contents</div>'
assert_have_tag(html, 'div.row', 'contents')
end
def test_complex_html_with_contents
html = <<~HTML
<div id="intro" class="row">
<div class="col-md-12">
<h1>Header</h1>
</div>
</div>
HTML
assert_have_tag(html, 'div#intro.row > .col-md-12 > h1', 'Header')
end
# Error handling
def test_basic_error_handling
html = '<br>'
error_msg = 'Expected "<br>" to have tag "div", but no such tag was found'
assert_returns_error(error_msg) do
assert_have_tag(html, 'div')
end
end
## Testing for non-existence of the expected HTML tag, including contents
def test_negated_basic_html_tag
html = '<abbr>'
refute_have_tag(html, 'br')
end
def test_negated_basic_html_attributes
html = '<div id="header" class="flex"></div>'
refute_have_tag(html, 'div.flex-wrap')
refute_have_tag(html, 'div[@class=flex-wrap]')
refute_have_tag(html, 'div#hero')
end
def test_negated_basic_html_tag_contents
html = '<div class="row">contents</div>'
refute_have_tag(html, 'div.row', 'some content')
end
def test_negated_complex_html_with_contents
html = <<~HTML
<div id="intro" class="row">
<div class="col-md-12">
<h1>Header</h1>
</div>
</div>
HTML
refute_have_tag(html, 'div#intro.row > .col-lg-12 > h2', 'Header')
end
def test_negated_basic_error_handling
html = '<br>'
error_msg = 'Expected "<br>" to NOT have tag "br", but such a tag was found'
assert_returns_error(error_msg) do
refute_have_tag(html, 'br')
end
end
endUsing Expectation Syntax
describe 'HTML Response' do
let(:html) { '<div id="header" class="flex"></div>' }
let(:label) { %(<label for="name">Username:</label>\n) }
it 'confirms HTML attributes' do
_(html).must_have_tag('div.flex')
end
it 'refutes HTML attribute' do
_(html).wont_have_tag('div.flex-wrap')
end
it 'regex content matching' do
_(label).must_have_tag('label[for=name]', /User/) }
_(label).wont_have_tag('label[for=name]', /Name/) }
end
# ...
endDevelopment
Get started with these commands:
# clone the repository
git clone https://github.com/kematzy/minitest-have_tag.git
# change into repository directory
cd minitest-have_tag/
# install dependencies
bundle install
# run the default tests with coverage & rubocop checking
bundle exec rake
# enable automatic reloading of tests during development
bundle exec guardYou can also run bin/console for an interactive prompt that will allow you to experiment.
Install locally
To install this gem onto your local machine, run bundle exec rake install.
Release new version
To release a new version:
- ensure
bundle exec rakepasses. - update the version number in
version.rb. - run
bundle exec rake releasewhich:- creates a Git tag for the version;
- pushes Git commits and tags to GitHub;
- pushes the
.gemfile to RubyGems.org.
Contributing
Bug reports and pull requests are welcome at github.com/kematzy/minitest-have_tag.
Copyright
Copyright (c) 2015 - 2025 Kematzy
The gem is available as open source under the terms of the MIT License.