如何编写行为类似于内置断言的自定义 PHPUnit 断言?

2024-04-17

我如何编写自定义断言,例如assertFoo($expected, $actual),其行为类似于关于错误“堆栈跟踪”的内置断言?

我目前定义了以下方法(在扩展的类中)PHPUnit_Framework_TestCase):

public static function assertFoo($expected, $actual) {
    self::assertEquals($expected, $actual); 
}

如果我从测试中调用它并且测试失败,我会在调用堆栈中得到两项:

1) PreferencesTest::testSignupTeacher
Failed asserting that 5 matches expected 3.

/vagrant/myproject/tests/integration/PreferencesTest.php:17
/vagrant/myproject/tests/integration/PreferencesTest.php:136

17号线是哪里assertFoo()调用内置的assertEquals()并失败; 136号线在那里assertFoo()叫做。

如果我将测试更改为调用assertEquals()直接,我只得到一个:

1) PreferencesTest::testSignupTeacher
Failed asserting that 3 is true.

/vagrant/myproject/tests/integration/PreferencesTest.php:136

有一些手册中的文档 http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.custom-assertions,但似乎没有涵盖这一点。


我对这个问题的第一个猜测(你没有使用其中一个PHPUnit_Framework_Constraint_*物体和self::assertThat)结果完全无关!实际的答案是 phpUnit 有助于从堆栈跟踪中过滤掉其自己代码库中的任何内容,而只将函数留在用户空间中!

执行此操作的代码可以在/path/to/PHPUnit/Util/Filter.php (where /路径/到/ is /usr/共享/php在我的机器上)和感兴趣的功能是getFilteredStacktrace and isFiltered.

如果您想控制此行为,请将您的自定义断言放入派生自的类中PHPUnit_Framework_TestCase,然后从该类派生您的测试。在您的自定义类文件中,在某处调用addFileToFilter,如下所示:

class My_Base_TestCase extends PHPUnit_Framework_TestCase{
  public static function assertFoo($expected, $actual) {
    self::assertEquals($expected, $actual); 
  }
}

PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'DEFAULT');

然后在另一个文件中你有:

class CustomTest extends My_Base_TestCase{

  /** */
  public function testSomething2(){
    $this->assertFoo( 8,  5+4 );
  }
}

它的行为就像内置的assertEquals().

免责声明:这是使用未记录的行为!我将尝试找出该机制是否能够合理地适应未来。

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

如何编写行为类似于内置断言的自定义 PHPUnit 断言? 的相关文章

随机推荐

  • 如何将 tkinter 按钮垂直浮动在左侧

    我希望我的 tkinter 按钮 条目和文本垂直浮动在左侧的中间 我尝试过使用 pack 和 side left 但它只是水平堆叠它们 如果我可以垂直堆叠它们那就完美了 我尝试过使用网格 但无法将它们放在中间 我尝试过anchor w 但也
  • 如何设置特定Facebook页面的manage_pages权限?

    我如何将我的应用程序的管理页面权限仅设置为特定页面 现在我的应用程序获得了管理 Facebook 用户的所有页面的权限 我如何限制这一点并获得仅访问特定页面的权限 我正在使用一种简单的身份验证方法 app id xxxxxxxxxxxxx
  • Android Oreo (API26) 和 android.app.DownloadManager

    各位 此代码不适用于 Android Oreo 但在旧版本上可以 我可以看到通知和DownloadManager ACTION DOWNLOAD COMPLETE广播消息 Kotlin testButton setOnClickListen
  • OleDB INSERT 命令错误

    我有一个数据库 我使用 MS ACCESS 我有这个插入代码 我可以读取数据 但写入时出错 我按照说明操作 但它不起作用 这是我的代码 OleDbConnection con new OleDbConnection provider Mic
  • 设置 JOptionPane 对话框的助记符和热键

    是否可以为 JOptionPane 对话框中的按钮分配热键和助记符 我希望能够在 JOptionPane 生成的带有 是 否 和 取消 选项的消息对话框中 按 Y 键单击 是 按钮 按 N 键单击 否 按钮 然后按 escape 键激活转义
  • Kubernetes - 以编程方式找出服务 IP 范围 CIDR

    我需要一种方法来获取适用于所有 Kubernetes 集群的服务集群 IP 范围 如 CIDR 我尝试了以下方法 这对于使用 kubeadm 创建的集群效果很好 因为它会 grep apiserver pod 的参数 kubectl clu
  • 对数与平方根的 Big-O

    一般来说 以下内容总是正确的吗 log n O na a 1 s t a is any constant positive integer perhaps very large 如果不是的话 最大的值是多少a这个陈述对于哪些人来说是正确的
  • MySQL 加入不存在的地方

    我有一个连接两个表的 MySQL 查询 Voters 家庭 他们加入voters household id and household id 现在我需要做的是修改它 将选民表连接到第三个表 称为消除 voter id and elimina
  • 如何进行应用内购买去除广告

    我有 Android 游戏项目 我正在使用 ad mob 来投放广告 但是 如果有人想去掉广告就必须先付费怎么办 你能给我教程吗 因为我是 Android 和 Java 的新手 您只需在应用程序中创建一个按钮即可进行应用内购买 并且 一旦用
  • 使用 Gradle 运行命令行并保存输出结果

    我想使用 Gradle 运行命令行 该命令有一个输出 我在 Windows powershell 中运行此命令 mybat bat myArgs当我按回车键时 它会打印一些数字 如下所示 123456我想用 gradle 运行这个命令并保存
  • 在 SwiftUI 中创建自定义 Spacer() 时如何读取容器轴

    在 SwiftUI 中Spacer 文档 https developer apple com documentation swiftui spacer https developer apple com documentation swif
  • Sitecore - 如何导入内容?

    因此 我收到了一项新任务 将内容从网站导入到使用 Sitecore CMS 构建的新网站 我的客户基本上正在进行改造 以前的网站是使用非常旧的 CMS 构建的 所有内容都是 HTML 格式 我实际上正在考虑抓取旧网站并将所有内容转储为 cs
  • 在 Android Studio 上导入 panoramaGL

    我在项目中导入 PanoramaGL 库时遇到问题 这是图书馆https github com zarelaky panoramagl android tree master PanoramaGL https github com zare
  • 何时使用 HashMap 而不是 LinkedList 或 ArrayList,反之亦然

    为什么我们不能总是使用 HashMap 尽管它在添加 删除操作上比 ArrayList 或 LinkedList 高效得多 而且与元素的数量无关 我用 google 搜索了一下 发现了一些原因 但使用 HashMap 总有一种解决方法 而且
  • 获得令牌后如何从 Google Plus API 获取电子邮件地址

    我使用 oauth2 0 获得了 accesstoken 我能够获取人名 性别等 但无法获取用户的电子邮件地址 任何人都可以粘贴一些示例代码或任何有关如何从 google plus API 获取电子邮件地址的建议吗 如果用户明确授权您的应用
  • 匿名函数 C++

    我正在尝试使用该功能signal int void int from
  • 在 Emacs Lisp 中检查字符串是否以后缀结尾

    是否有一个函数可以检查字符串是否以某个子字符串结尾 Python 有endswith http docs python org 2 library stdtypes html highlight endswith str endswith
  • 如何在 Flask-Login 中实现 user_loader 回调

    我正在尝试使用 Flask 和Flask 登录 http packages python org Flask Login在 Flask 应用程序中实现用户身份验证的扩展 目标是从数据库中提取用户帐户信息 然后登录用户 但我遇到了困难 但是
  • jquery contenteditable 换行符

    我有一个内容可编辑区域 我正在尝试禁用输入 返回和移动输入来创建新段落 我使用下面的脚本进行此操作 但它同时禁用了所有按钮 我想做的是返回放置一个换行符 而不是转到一个新段落 content keypress function e retu
  • 如何编写行为类似于内置断言的自定义 PHPUnit 断言?

    我如何编写自定义断言 例如assertFoo expected actual 其行为类似于关于错误 堆栈跟踪 的内置断言 我目前定义了以下方法 在扩展的类中 PHPUnit Framework TestCase public static