Skip to content

Commit

Permalink
[JUnitFormatter] Display exception trace on failed example
Browse files Browse the repository at this point in the history
Escaped exception trace and message to avoid messing junit xml
  • Loading branch information
gquemener committed Feb 1, 2014
1 parent d45b19e commit b548a59
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 5 deletions.
33 changes: 32 additions & 1 deletion spec/PhpSpec/Formatter/JUnitFormatterSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,38 @@ function it_stores_a_testcase_node_after_broken_example_run(
'<testcase name="example title" time="1337" classname="Acme\Foo\Bar" status="broken">' . "\n" .
'<error type="spec\PhpSpec\Formatter\ExceptionStub" message="Something went wrong" />' . "\n" .
'<system-err>' . "\n" .
'Exception trace' . "\n" .
'<![CDATA[' . "\n" .
'Exception trace' . "\n" .
']]>' . "\n" .
'</system-err>' . "\n" .
'</testcase>'
));
}

function it_stores_a_testcase_node_after_failed_example_run(
ExampleEvent $event,
SpecificationNode $specification,
\ReflectionClass $refClass
) {
$event->getResult()->willReturn(ExampleEvent::FAILED);
$event->getTitle()->willReturn('example title');
$event->getTime()->willReturn(1337);

$event->getException()->willReturn(new ExceptionStub('Something went wrong', 'Exception trace'));

$event->getSpecification()->willReturn($specification);
$specification->getClassReflection()->willReturn($refClass);
$refClass->getName()->willReturn('Acme\Foo\Bar');

$this->afterExample($event);

$this->getTestCaseNodes()->shouldReturn(array(
'<testcase name="example title" time="1337" classname="Acme\Foo\Bar" status="failed">' . "\n" .
'<failure type="spec\PhpSpec\Formatter\ExceptionStub" message="Something went wrong" />' . "\n" .
'<system-err>' . "\n" .
'<![CDATA[' . "\n" .
'Exception trace' . "\n" .
']]>' . "\n" .
'</system-err>' . "\n" .
'</testcase>'
));
Expand Down
17 changes: 13 additions & 4 deletions src/PhpSpec/Formatter/JUnitFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ class JUnitFormatter extends BasicFormatter
ExampleEvent::BROKEN => 'broken',
);

/** @var array */
protected $resultTags = array(
ExampleEvent::FAILED => 'failure',
ExampleEvent::BROKEN => 'error',
);

/**
* Set testcase nodes
*
Expand Down Expand Up @@ -91,17 +97,20 @@ public function afterExample(ExampleEvent $event)
$this->jUnitStatuses[$event->getResult()]
);

if (ExampleEvent::BROKEN === $event->getResult()) {
if (in_array($event->getResult(), array(ExampleEvent::BROKEN, ExampleEvent::FAILED))) {
$exception = $event->getException();
$testCaseNode .= sprintf(
'>' . "\n" .
'<error type="%s" message="%s" />' . "\n" .
'<%s type="%s" message="%s" />' . "\n" .
'<system-err>' . "\n" .
'%s' . "\n" .
'<![CDATA[' . "\n" .
'%s' . "\n" .
']]>' . "\n" .
'</system-err>' . "\n" .
'</testcase>',
$this->resultTags[$event->getResult()],
get_class($exception),
$exception->getMessage(),
htmlentities($exception->getMessage()),
$exception->getTraceAsString()
);
} else {
Expand Down

0 comments on commit b548a59

Please sign in to comment.