[英]PHPUnit asserting identical HTML structure regardless of whitespace
我有一個命令行腳本,它生成一些我正在嘗試使用 PHPUnit 進行單元測試的 HTML。 請注意,瀏覽器看不到此 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());
}
好吧,有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:測試 XML 生成中描述。
如果您只關心有效的HTML,但不匹配確切的模板,則建議使用https://packagist.org/packages/phpfui/html-unit-tester
您基本上希望通過驗證程序運行盡可能多的生成的html和css。 您真正關心的是HTML(和CSS)的格式正確。 這適應了將來的功能和與數據相關的更改。 您的代碼必須產生有效的HTML和CSS。
https://packagist.org/packages/phpfui/html-unit-tester根據w3.org標准進行驗證,因此將始終保持最新的HTML規范。
不完全是您要尋找的,而是您應該執行的非常有效的測試。
十年后,安德魯斯的評論仍然有用:)
$expectedHtml =
<<<HTML
<html>
...
</html>
HTML;
$result = $someHtmlRenderer->render($someData);
self::assertXmlStringEqualsXmlString($expectedHtml, $result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.