PHPUnit断言相同的HTML结构,而不考虑空格


PHPUnit asserting identical HTML structure regardless of whitespace

我有一个命令行脚本,生成一些HTML,我试图使用PHPUnit进行单元测试。注意,这个HTML是不能被浏览器看到的,所以Selenium不是这个问题的正确解决方案。

我只关心比较实际的HTML结构。我使用的是assertEquals(),但实际的strings可能不完全相同,因为有各种空白字符。

public function testHtmlIsIdentical()
{
    $expectedReport = file_get_contents('expected.html');
    $this->report->setupSomeData('test data');
    $actualReport = $this->report->generateHtml();
    $this->assertEquals($expectedReport, $actualReport);
}

为了比较HTML的结构(节点)而不是HTML的字符串,我能做些什么?PHPUnit是否有这样的特性?是否有一个独立的库来比较HTML?

解决方案:

PHPUnit有比较XML的断言:

  • assertXmlFileEqualsXmlFile()
  • assertXmlStringEqualsXmlFile()
  • assertXmlStringEqualsXmlString()

assertXmlStringEqualsXmlFile在这种情况下工作完美:

public function testHtmlIsIdentical()
{
    $this->report->setupSomeData('test data');
    $this->assertXmlStringEqualsXmlFile('expected.html', $this->report->generateHtml());
}

DomDocument,如果你想检查HTML元素的顺序是否匹配,你可以使用它。

如果所有不同的地方都是多余的空格,可以尝试:

$expectedDom = new DomDocument();
$expectedDom->loadHTMLFile('expected.html');
$expectedDom->preserveWhiteSpace = false;
$actualDom = new DomDocument();
$actualDom->loadHTML($this->report->generateHtml());
$actualDom->preserveWhiteSpace = false;
$this->assertEquals($expectedDom->saveHTML(), $actualDom->saveHTML());

参见preservewhitespace

同样值得研究的是assertEqualXMLStructure,因为它也可以用来比较HTML:

assertEqualXMLStructure(
    DOMElement $expectedElement,
    DOMElement $actualElement
    [, bool $checkAttributes = false,
    string $message = '']
)

但是您可能会再次遇到空白的问题,所以您可能需要在比较之前剥离这些空白。使用DOM的好处是,在文档不匹配的情况下,您可以获得更好的错误报告。

另一种测试XML/HTML生成的方法在Practical PHPUnit: testing XML generation中描述。

十年后,Andrews的评论仍然有用:)

$expectedHtml =
    <<<HTML
        <html>
            ...
        </html>
    HTML;
$result = $someHtmlRenderer->render($someData);
self::assertXmlStringEqualsXmlString($expectedHtml, $result);