无论空格如何,PHPUnit都断言相同的HTML结构

And*_*rew 9 html php phpunit unit-testing

我有一个命令行脚本生成一些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);
}
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来比较HTML的结构(节点)而不是HTML的字符串?是否有PHPUnit的功能允许这个?是否有用于比较HTML的独立库?

解:

PHPUnit有比较XML的断言:

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

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

edo*_*ian 12

好吧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());
Run Code Online (Sandbox Code Playgroud)

preservewhitespace.

还有什么值得研究的,assertEqualXMLStructure因为这也可用于比较HTML:

assertEqualXMLStructure(
    DOMElement $expectedElement,
    DOMElement $actualElement
    [, bool $checkAttributes = false,
    string $message = '']
)
Run Code Online (Sandbox Code Playgroud)

但是你可能会再次遇到空白问题,所以也许你需要在比较之前去除那些空白.使用DOM的好处是,如果文档不匹配,您可以获得更好的错误报告.

另一种测试XML/HTML生成的方法在Practical PHPUnit:Testing XML generation中进行了描述.

  • 我无法让你的第二个例子起作用,但它让我找到了完美的`assertXmlStringEqualsXmlString()`方法! (3认同)