TestXml

DESCRIPTION

TestXml is a small extension for testing XML/HTML. Extending RSpec and TestUnit it makes asserting and comparing XML snippets easy, and is especially helpful for testing RESTful web services and their XML representations.

FEATURES

  • Runs with RSpec 2 or 3, Test::Unit, MiniTest and Cucumber

  • Ruby >= 1.8

  • Test XML structure and content

INSTALL

gem install test_xml

EXAMPLES

Test::Unit and MiniTest

def test_item_representation
  assert_xml_equal "<item><id>1</id></item>", @item.to_xml
end

RSpec

it "should contain the id" do
  @item.to_xml.should equal_xml(<<-XML)
    <item>
      <id>1</id>
    </item>
  XML
end

Cucumber

Scenario:
  When I post some data
  Then the response should match the following xml
  """
    <transaction>
      <status>success</status>
      <id/>
      <order_id/>
    </transaction>
  """

USAGE:

RSpec

In your spec_helper.rb

require 'test_xml/spec'

And in the actual spec, use these matchers:

  • equal_xml

  • contain_xml

  • equal_xml_structure

  • contain_xml_structure

Test::Unit

In the test_helper.rb

require 'test_xml/test_unit'

In your test file, use these matchers:

  • assert_xml_equal

  • assert_xml_contain

  • assert_xml_structure_equal

  • assert_xml_structure_contain

Negative assertions are available as assert_not_*.

MiniTest

In the test_helper.rb

require 'test_xml/mini_test'

Check the Test::Unit section for available assertions.

Cucumber

In the features/env.rb

require 'test_xml'
require 'test_xml/spec'
World(TestXml::Spec)

In your steps file e.g. features/step_definitions/xml_steps.rb add this step:

Then /^the response should match the following xml$/ do |xml|
  response.body.should equal_xml(xml)
end

ASSERTIONS

XML is Equal

Elements, attributes and text nodes are all the same

XML Contains

The XML contains the given structure. Checks ancestral relationships, elements, attributes and text nodes starting from and including the root node.

For example, given this XML:

<a>
  <b><c>Cee</c></b>
  <d>Dee</b>
</a>

This will fail:

<b><c>Cee</c></b>

as b is not the root node. The check must be written as:

<a>
  <b><c>Cee</c></b>
</a>

XML Structure is Equal

Like XML is equal, but ignores attributes and text nodes

XML Structure Contains

Like XML contains, but ignores attributes and text nodes

REQUIREMENTS

  • nokogiri

Many Thanks

Nick Sutterer thank you for bringing RSpec 2, Ruby 1.9.2 and MiniTest! You revived the gem! :)

LICENSE

Copyright © 2010-2011, Pavel Gabriel

Released under the MIT License.