PHPUnit утверждает идентичную структуру HTML независимо от пробела - PullRequest
9 голосов
/ 24 августа 2011

У меня есть скрипт командной строки, который генерирует некоторый 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:

assertXmlStringEqualsXmlFile отлично работает в этом сценарии:

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

1 Ответ

12 голосов
/ 24 августа 2011

Ну, есть 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 описан в Практический PHPUnit: тестирование генерации XML .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...