PHPUnit утверждает идентичную структуру HTML независимо от пробелов

У меня есть сценарий командной строки, который генерирует некоторый 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()); } 

Solutions Collecting From Web of "PHPUnit утверждает идентичную структуру HTML независимо от пробелов"

Ну есть 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()); - $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 :

 assertEqualXMLStructure( DOMElement $expectedElement, DOMElement $actualElement [, boolean $checkAttributes = FALSE, string $message = ''] ) 

так как это можно использовать для сравнения html.

Но вы можете столкнуться с проблемами с пробелами снова, поэтому, возможно, вам нужно снять их перед сравнением. Преимущество использования DOM заключается в том, что вы получаете гораздо более приятную отчетность об ошибках, если документы не совпадают.

Другой способ тестирования генерации xml / html описан в:

Practical PHPUnit: Testing XML generation