Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

TODO blocks for Test::XML, and in general

by nglenn (Beadle)
on Sep 04, 2012 at 16:56 UTC ( #991654=perlquestion: print w/replies, xml ) Need Help??
nglenn has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to use Test::XML::XPath, and I need to user Test::More's TODO block. It doesn't seem to work as stated in the Test::More documentation; this doesn't work:

use Test::More; use Test::XML::XPath; plan tests=>1; TODO: { local $TODO = 'testing todo block'; like_xpath('<xml-bad/>', '/xml', 'test test'); }

Running prove with the above test placed in 'test.t' gives the following output, failing the suite instead of passing it:

t\test.t .. t\test.t .. 1/1 # Failed test 'test test' # at C:/strawberry/perl/site/lib/Test/XML/ line 55. # input: <xml-bad/> # does not match: /xml # Looks like you failed 1 test of 1. t\test.t .. Dubious, test returned 1 (wstat 256, 0x100) Failed 1/1 subtests Test Summary Report ------------------- t\test.t (Wstat: 256 Tests: 1 Failed: 1) Failed test: 1 Non-zero exit status: 1 Files=1, Tests=1, 1 wallclock secs ( 0.19 usr + 0.14 sys = 0.33 CPU +) Result: FAIL

I wanted to try and write/send a patch for the module, but I realized I have no idea what I'm doing :) Looking at the source for Test::More, I do not understand how TODO blocks work. Looking at the source for Test::XML::XPath, I see that it uses Test::Builder and Test::More, but I have no idea how you would have to write the code to make it compliant with Test::More's TODO, TODO_skip, and SKIP blocks. Can anyone explain a) how the block functionality is implemented in Test::More and b) the proper way to write a testing module that preserves this functionality?

Replies are listed 'Best First'.
Re: TODO blocks for Test::XML, and in general
by MidLifeXis (Monsignor) on Sep 04, 2012 at 17:15 UTC

    Can you add the actual output and what you expect the output to be? For example, on my machine, I get:

    #$ perl -MTest::More -e 'plan "no_plan";TODO:{local $TODO="foo bar"; f +ail("blog");}' not ok 1 - blog # TODO foo bar # Failed (TODO) test 'blog' # at -e line 1. 1..1

    This is a valid TODO test (and a harness would mark the test suite as passed, even though it looks like it has failed). I don't have Test::XML::XPath installed, so just in case this is more of a case of improper expectations, pasting what you are seeing might help.


      I updated it. Running with prove shows that the test causes the entire test suite to fail.

        Stupid question, but does my snippet above emit a TODO test?

        I also rebuilt the like_xpath routine after removing the lines making use of the XPath parser (see below). What output do you get from it?

        use strict; use warnings; use Carp; use Test::More; use Test::Builder; sub like_xpath { my ($input, $statement, $test_name) = @_; die "usage: like_xpath(xml,xpath[,name])" unless $input && $statement; my $Test = Test::Builder->new; my $ok = eval { # Hardcode a failure return 0; }; if ($@) { $Test->ok( 0, $test_name ); $Test->diag( " Parse Failure: $@" ); return 0; } else { ok( $ok, $test_name ); unless ( $ok ) { diag ( " input: $input" ); diag ( " does not match: $statement" ); } return $ok; } } plan tests=>1; TODO: { local $TODO = 'testing todo block'; like_xpath('<xml-bad/>', '/xml', 'test test'); }