Easy Markup Validation
2009-06-12 @ 17:24I wanted a test helper that would assert that my XHTML was valid XHTML. So I wrote one and called it “markup_validity”. You can use it too, and I will show you how.
First, install the gem:
$ sudo gem install markup_validity
Then, use it in your tests:
require 'test/unit' require 'rubygems' require 'markup_validity' class ValidHTML < Test::Unit::TestCase def test_i_can_has_valid_xhtml assert_xhtml_transitional xhtml_document end end
Oh. You use RSpec? It supports that too:
require 'rubygems' require 'markup_validity' describe "my XHTML document" do it "can has transitional xhtml" do xhtml_document.should be_xhtml_transitional end end
Debugging invalid markup can be a pain. MarkupValidity tries to give you helpful errors to make your life easier. Say you have an invalid piece of XHTML like this: ~~~ plain
Hello
The error output from MarkupValidity will be this:
~~~ plain
.Error on line: 2:
Element 'head': Missing child element(s). Expected is one of ( script, style, meta, link, object, isindex, title, base ).
1: <html xmlns="http://www.w3.org/1999/xhtml">
2: <head>
3: </head>
4: <body>
5: <p>
Error on line: 6:
Element 'p': This element is not expected. Expected is one of ( a, br, span, bdo, object, applet, img, map, iframe, tt ).
5: <p>
6: <p>
7: Hello
8: </p>
9: </p>
MarkupValidity provides a few assertions for test/unit:
- assert_xhtml_transitional(xhtml) for asserting valid transitional XHTML
- assert_xhtml_strict(xhtml) for asserting valid strict XHTML
- assert_schema(schema, xml) for asserting that your xml validates against a schema
- assert_xhtml which is an alias for assert_xhtml_transitional
The methods provided for RSpec are quite similar:
- be_xhtml_transitional for asserting valid transitional XHTML
- be_xhtml_strict for asserting valid strict XHTML
- be_valid_with_schema(schema) for asserting that your xml validates against a schema
- be_xhtml which is an alias for be_xhtml_transitional
MarkupValidity even works well with rails. Here is an example rails controller test: ~~~ ruby require ‘test_helper’ require ‘markup_validity’
class AwesomeControllerTest < ActionController::TestCase test “valid markup” do get :new assert_xhtml_transitional @response.body end end ~~~