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

2023-11-21

我有一个命令行脚本,可以生成一些 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()

The 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());

See preservewhitespace.

还值得研究的是assertEqualXMLStructure因为这也可以用来比较 HTML:

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

但是您可能会再次遇到空格问题,因此您可能需要在比较之前删除这些空格。使用 DOM 的好处是,如果文档不匹配,您可以获得更好的错误报告。

测试 XML/HTML 生成的另一种方法在实用 PHPUnit:测试 XML 生成.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 在manifest中设置Android沉浸式全屏模式

    在新的 KitKat 中有沉浸式全屏模式 可以这样使用 要为您的应用程序提供充满整个屏幕的布局 setSystemUiVisibility 的新 SYSTEM UI FLAG IMMERSIVE 标志 当 与 SYSTEM UI FLAG
  • Git 与 SVN 需要多少空间?

    我们目前使用 Subversion 作为我们的源代码存储库 我们正处于转换为 Git 的规划阶段 我们的 Subversion 存储库目前为 19Gb 在磁盘空间要求方面 Git 存储库与 Subversion 相比如何 我的 19Gb s
  • Docker(Spring Boot 或 Thorntail)和 Keycloak

    我在 docker 容器中运行 Spring Boot 和 Keycloak 时遇到问题 我从 Keycloak 开始 将 mysql 作为在 docker 中运行的数据库 services mysql image mysql 5 7 co
  • 如何访问名称中带有点的 python argparse 参数

    Python 的 argparse 允许我定义名称中包含点的参数名称 但我怎样才能访问这些呢 import argparse parser argparse ArgumentParser parser add argument inputf
  • CSS 最小化器?

    您是否知道在线 CSS 压缩器可以帮助删除冗余 低效的 CSS 声明并用更优化的 CSS 替换它 意思是 我知道存在很多 压缩器 它们只是删除选项卡 删除注释等 但我正在寻找的是足够聪明的东西来知道 border top 1px solid
  • 使 EditText 仅显示小数点后两位

    我想在编辑文本中仅显示两位小数 ofc 我想在编辑文本中显示货币 但将其值限制为小数点后两位 我见过一些使用正则表达式的解决方案 但我不想这样做 有人告诉我 java 支持一些可以做到这一点的内部库函数 任何人都可以给我提示或给我一些有效的
  • 将文本区域接收的数据输出回文本区域时,如何正确清理从文本区域接收的数据?

    用户将在文本区域中输入文本 然后将其直接插入到 mySQL 数据库中 我在上面使用了trim htmlentities mysql real escape string 并且启用了魔术引号 将数据输出回文本区域时应该如何清理它 感谢您的帮助
  • .NET Core 2.0 与 MySQL:指定的键太长;最大密钥长度为 3072 字节

    我是一名 PHP MySQL 开发人员 正在尝试转向其他技术 例如 NET Core 我不确定我是否喜欢从 MySQL 切换到 SQL Server 由于许可 的想法 因此我一直在尝试让 NET Core 与 MySQL 很好地配合 我已经
  • Angular 2 每次按键时都会更改事件

    仅在输入焦点更改后才会调用更改事件 我怎样才能让事件在每次按键时触发
  • d3 地图上的线不形成曲线

    我使用 d3 js 创建了一个地图 我想在两个位置之间显示一条曲线 我能够显示一条线 但有时它不能形成完美的曲线 对于某些线路 线路会在地图后面 穿过反子午线 弯曲到达目的地 这是演示该问题的代码笔 https codepen io pee
  • 多个视图 OnTouch 事件

    我们正在开发一个应用程序 需要同时从多个视图捕获 MotionEvent 当我们尝试这样做时 Android 只会将事件分派到第一个触摸的视图 并且当同时触摸另一个视图时 它只会在第一个视图上为我们提供 ACTION POINTER DOW
  • 如何制作一个出色的 R 可重现示例

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 当与同事讨论性能 教学 发送错误报告或在邮件列表和 Stack Overflow 上搜索指导时 可重现的例子经常被问到并且总是有帮助 创建优秀示例的技巧是什么
  • WatchKit WKInterfaceLabel 无法更改字体

    我正在尝试更改标签字体 但是我在属性检查器中设置的每种字体都与系统字体不同 不要更改任何内容 模拟器或故事板都不会更改 我什至尝试使用属性字符串以编程方式设置字体 出现相同的系统字体 感谢您的帮助 目前您无法使用 WatchKit 中包含的
  • 如何获取 UIElement 的父级?

    好的 我知道FrameworkElement 它是一个直接子类UIElement has a Parent财产 但是Panel对象有类型的子对象UIElement not FrameworkElement The Children属性是类型
  • npm 错误! 405 不允许的方法:express@latest

    此处发布的几个 405 相关问题中 没有一个适用于我的问题 以下是我从台式电脑上的 Windows 7 发出的命令 npm install express 这是错误消息 npm ERR code E405 npm ERR 405 Metho
  • Discord.js MessageEmbed fields.flat 不是函数

    我正在使用 JavaScript 和 Discord js 制作一个 Discord 机器人 在那里 我想将 RichEmbed MessageEmbed 我不知道它是如何调用的 发送到通道 但它没有发送嵌入 而是在discord js 中
  • 模板化上下文中的显式析构函数

    我想明确地销毁一个vector在模板化的上下文中 以下内容对我有用 GNU C 4 3 4 4 和 Clang 1 1 template
  • Visual Studio 2015 中的 Qt 项目:“无法解析的外部符号 wWinMain”

    整个错误输出是 LNK2019 unresolved external symbol wWinMain referenced in function int cdecl scrt common main seh void scrt comm
  • 对于“不”来说,什么更“Pythonic”[重复]

    这个问题在这里已经有答案了 两种方式我都见过 但哪种方式更Pythonic a 1 2 3 version 1 if not 4 in a print is the not more pythonic version 2 if 4 not
  • PHPUnit 断言相同的 HTML 结构,无论空格如何

    我有一个命令行脚本 可以生成一些 HTML 我正在尝试使用 PHPUnit 对其进行单元测试 请注意 此 HTML 是浏览器看不到 所以 Selenium 不是这个问题的正确解决方案 我只关心比较实际的 HTML 结构 我在用着assert