不使用 PHPUnit 测试受保护/私有方法时的代码覆盖率

2024-07-04

我知道可以使用反射或其他解决方法使用 PHPUnit 测试私有/受保护的方法。

但大多数消息来源告诉我,这是not为类内部的私有方法编写测试的最佳实践。

您应该像测试一个“黑匣子”一样测试该类 - 您只需通过比较输入与输出来测试预期行为,而不考虑内部机制。为类编写测试还应该通过显示缺乏代码覆盖率来通知您未使用的私有方法。

当我测试我的类并生成 HTML 报告时,它显示私有方法未被测试覆盖,即使调用它们的行绝对被执行/覆盖。我知道私有方法被执行,因为如果它们没有被执行,我的类上的断言将不会通过。

这是 PHPUnit 中的预期行为吗?我可以争取 100% 的覆盖率,同时仍仅间接测试私有方法吗?

一些简化的示例代码(在 Symfony2 中使用 RestBundle):

class ApiController extends FOSRestController {

/*
 * @REST\View()
 * @REST\Get("/api/{codes}")
 */
public function getCodesAction($codes) {
    $view = new View();
    $view->setHeader('Access-Control-Allow-Origin', '*');
    $view->setData(array('type' => 'codes','data' => $this->_stringToArray($codes)));
    $view->setFormat('json')->setHeader('Content-Type', 'application/json');
    return $this->handleView($view);
}

private function _stringToArray($string){
    return explode('+',$string);
}

公共函数显示为“被覆盖”,私有函数被间接覆盖,但在 PHPUnit 报告中显示为红色。

Test:

class ApiControllerTest extends WebTestCase {

    public function test_getCodesAction(){
        $client = static::createClient();
        $client->request('GET', '/api/1+2+3');
        $this->assertContains('{"type": "codes", "data": [1,2,3]}', $client->getResponse()->getContent());
    }

}

当然,这只是一个愚蠢的例子,我也可以将explode()包含在公共函数中;但是我正在编写测试的控制器包含更复杂和可重用的私有函数,这些函数以更复杂的方式转换数据(但仍然没有副作用)。


在 Phpunit 中,您可以使用特殊注释指定涵盖的方法,如中所述doc https://phpunit.de/manual/current/en/code-coverage-analysis.html#code-coverage-analysis.specifying-covered-methods.

你可以这样做:

    class ApiControllerTest extends WebTestCase {

        /**
         * @covers ApiController::getCodesAction
         * @covers ApiController::_stringToArray
         */
        public function test_getCodesAction(){
            $client = static::createClient();
            $client->request('GET', '/api/1+2+3');
            $this->assertContains('{"type": "codes", "data": [1,2,3]}', $client->getResponse()->getContent());
        }

    }

希望这有帮助

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

不使用 PHPUnit 测试受保护/私有方法时的代码覆盖率 的相关文章

  • 如何将路径附加到 .htaccess 中的 PHP include_path

    目前在我的网站上我使用的语句如下 include head php include head php include head php 取决于我有多少嵌套文件夹 我确信有更好的方法来做到这一点 我相信 htaccess是解决方案 但我不确定
  • $.getJSON 和 PHP 文件

    是否可以隐藏 php 文件的名称 document ready function getJSON getdata php function returned data if returned data 1 div wall html use
  • 当我访问不存在路由的类时,如何在codeIgniter中设置默认函数?

    控制器是这样的 class Abc extends CI controller public function index public function f1 如果网址是http host app Abc index它得到函数索引如果网址
  • 不使用 PHPUnit 测试受保护/私有方法时的代码覆盖率

    我知道可以使用反射或其他解决方法使用 PHPUnit 测试私有 受保护的方法 但大多数消息来源告诉我 这是not为类内部的私有方法编写测试的最佳实践 您应该像测试一个 黑匣子 一样测试该类 您只需通过比较输入与输出来测试预期行为 而不考虑内
  • PHP 函数从 Web 服务获取数据

    我怎样才能从中获取数据这个网络服务 http onleague stormrise pt 8031 OnLeagueRest resources onleague Utils Countries使用 PHP 我需要一个简单的 PHP 函数来
  • ASP.net 和 PHP 之间的根本区别是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 NET 和 ASP 与 PHP https stackoverflow com questions 606419 net asp vs php 是否存在速度差异 性能问题 企业选择其中一种的原因是什么
  • 使用 NSURLConnection 进行单元测试

    我想测试一段使用网络的代码 NSURLConnection类 具体而言 代码 我们称之为NetworkManager 看起来有点像这样 id buildConnection some more code and then return NS
  • 在 Codeigniter 中创建块/模块

    到目前为止 我一直很喜欢使用 CodeIgniter 创建一些简单的 Web 应用程序 实际上只是学习框架 但我无法找到创建块 模块的简单方法 我希望有一个 最近的图像 块 我可以将其放在网站上的任何页面上 而无需在每个页面的控制器中重复查
  • 用于 Eclipse 的 PHP 混乱检测器

    我安装了 PTI Eclipse 插件 有改变的可能PDepend CodeSniffer and UnitTest 当我尝试右键单击任何文件时 我会看到Mess Detector选项也是如此 但当我单击它时什么也没有发生 在搜索了所有配置
  • 调整大小然后裁剪 PHP

    好的 基本上我希望所有图像都是 170x170px 的正方形 因此 如果图像不是正方形 我希望调整它的大小 然后在中间裁剪 我花了很多时间玩这个 但一无所获 我已经让它裁剪较大图像的一部分等 但我特别需要调整图像大小 然后裁剪 任何帮助将不
  • Python单元测试(使用SQLAlchemy)不写入/更新数据库?

    我很困惑为什么我的 Python 单元测试在没有实际更新数据库的情况下运行得很好 我什至可以看到来自 SQLAlchemy 的 SQL 语句并逐步浏览新创建的用户对象的电子邮件 INFO sqlalchemy engine base Eng
  • 如何使用 TCPDF 将字体嵌入到 PDF 中?

    我尝试使用 TCPDF 其代码如下 require once SERVER DOCUMENT ROOT tcpdf tcpdf php pdf new TCPDF PDF PAGE ORIENTATION PDF UNIT PDF PAGE
  • PDO中使用持久连接有什么缺点

    在 PDO 中 可以使用以下方法使连接持久化PDO ATTR PERSISTENT属性 根据 php 手册 持久连接不会在脚本结束时关闭 而是 当另一个脚本请求连接时 会被缓存并重新使用 相同的凭据 持久连接缓存允许您 避免每次建立新连接的
  • 未找到特征“Venturecraft\Revisionable\RevisionableTrait”

    我正在使用 laravel 4 我想跟踪对表进行的所有交易的历史记录 我按照这些步骤操作 added venturecraft revisionable 1 在作曲家 json php composer phar update 在我的项目的
  • 将 PHP 转换为数组并循环

    我正在为我们的空手道学校开发一个应用程序 希望从数据库中获取技术名称 将它们以随机顺序存储在一个数组中 并且能够单击一个按钮一次在整个数组中移动 我以几种不同的方式考虑过这个问题 包括从数据库中随机进行 这非常简单 但它多次提取相同的技术
  • PHP 警告:模块“mcrypt”已加载

    当我使用 PHP 运行命令时 它显示一个错误 例如当我跑步时php v查看我的 PHP 版本 它显示一个错误 然后显示有关 PHP 的信息 模块 mcrypt 已加载到第 0 行的 未知 中 zied ubuntu php v PHP Wa
  • 如何在 PHP 中直接将 docx 转换为 ePub? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 试图找到一个 PHP 库 使我能够将 docx 转换为 ePub 我知道 Java 解决方案 例如http code google com
  • PHP imap_search 未检测到 gmail 收件箱中的所有邮件

    当我运行一个非常简单的imap search在我的 GMail 收件箱中 搜索返回的邮件数量少于应有的数量 这是任何拥有 GMail 帐户的人都可以运行的脚本 host imap gmail com 993 imap ssl user fo
  • 根据所选付款方式更改 WooCommerce 提交结帐按钮文本

    I tried 更改 WooCommerce 中特定付款方式的结帐提交按钮文本 https stackoverflow com questions 45739331 change checkout submit button text fo
  • PHP 使用正则表达式分解字符串

    我有一个长字符串 由一系列用单引号分隔的句子组成 Example This s sentence number 1 This s sentence number 2 请注意 该字符串的句子本身有单引号部分 这些部分已被转义 我需要使用单引号

随机推荐

  • 将一维数组复制到多维数组 - VBA

    我在 VBA 中有两个函数 Function1 返回一个一维数组 然后我有 function2 它是一个多维数组 我想将 Function1 中的数组复制到从索引 1 开始的多维数组的列 arr2 0 0 Something arr2 0
  • 使用 Spring Data JPA 和 JPA EntityListener 进行字段级加密

    我试图在插入 更新之前加密域实体上的一些字段 并在选择在 UI 中显示时解密它们 我将 Spring Data JPA 存储库与 Hibernate 和 EntityListener 结合使用 该 EntityListener 在 Post
  • java中的pagerank实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我计划为我的内部项目实现页面排名 并且使用这篇文章我得到了一些东西维基百科 http en wikip
  • 为所有支持 copy(id=newId) 方法的案例类创建共同特征

    我正在尝试做类似的事情 trait IdentifiableModel T self def copy id ObjectId T gt val id ObjectId 我发现了一些其他相关的问题试图做类似的事情 但他们并没有真正回答这个问
  • Mongoose 查询:查找数组中的元素

    Mongoose Mongo noob在这里 My Data 这是我的简化数据 每个用户都有自己的文档 v 1 id ObjectId 53440e94c02b3cae81eb0065 email email protected cdn c
  • 停止 jQuery 单击事件内底层 ng-click 的传播

    Twitter 引导程序dropdown嵌套在一个tr The tr可点击通过ng click 单击页面上的任意位置将折叠下拉菜单 该行为是通过指令定义的 document bind click closeMenu 因此 当打开菜单并且用户
  • 在父组件上调用 setstate 会强制对其子组件进行 componentDidUpdate?

    我有两个组件 父组件 App 和子组件 SearchBar 我希望 SearchBar 保持其自己的状态 并在更新其状态后调用其父组件作为 prop 提供的函数来更新其父状态 所以在我的 SearchBar 组件上我有 onSearchCh
  • ISerialized 接口有什么意义?

    似乎我可以序列化没有该接口的类 所以我不清楚它的目的 ISerializable用于提供自定义二进制序列化 通常用于BinaryFormatter 也许是为了远程处理的目的 如果没有它 它会使用字段 这些字段可以是 效率低下 如果有一些字段
  • 无法打印俄语字符

    我有一个俄语字符串 已编码为 UTF 8 String str u041E u041A System out println String str str 当我在 Eclipse 控制台中打印字符串时 我得到 谁能建议如何将俄语字符串打印到
  • 在 Parse iOS 中链接用户 ID 和安装 ID

    在 Parse 仪表板的数据浏览器窗格中 我看到安装和用户类 但是 对于特定设备上的特定用户 objectId 不匹配 现在 用户订阅的频道仅在安装类中可见 有没有什么方法可以将用户 ID 来自用户类别 链接到安装 ID 以便可以知道用户订
  • CXF 2.7.7 org.apache.cxf.interceptor.Fault:意外元素

    升级到 CXF 2 7 7 后 我遇到了无法理解的错误 当进行 Web 服务调用时 CXF 报告此异常 org apache cxf interceptor Fault Unexpected element http schema myor
  • 构建 VS 2013 安装项目时输出中出现重复消息

    我有一个 VS2013 安装项目 它构建了安装两个 C 项目生成的 exe 的安装程序 当我构建安装项目时 我收到重复的消息 就好像有两个构建过程一样 我从安装项目的输出中删除了两个 exe 之一 但我仍然收到重复的消息 Starting
  • 如何在不更改默认颜色和背景颜色的情况下使用CSS3 ::selection?

    默认情况下 HTML5 Boilerplate 模板中包含以下行 moz selection background fe57a1 color fff text shadow none selection background fe57a1
  • Android - Google Play 过滤掉 xxhdpi

    目前 我在使用 Google Play 过滤和 API 级别 16 中引入的新密度类 xxhpdi 时遇到问题 我的应用程序被分成 3 个 APK 文件 我知道这不是最佳实践 但由于计划不周 我现在必须这样做 有趣的部分是 Android
  • ASP.NET Core 3.0 控制器路由不起作用

    免责声明 我是 ASP NET Core Razor MVC 的新手 并且正在开始使用 3 0 预览版 我想要做的是在我的页面上有一个 按钮 将一个新的空项目添加到列表中 以便用户可以输入一些值 从我读过的内容 相当多 来看 听起来有一个指
  • 如何查明序列是否在此会话中初始化?

    我需要读取函数中序列的当前值 但是 在每个会话中我第一次尝试使用 currval 时 出现以下错误 currval of sequence foo seq is not yet defined in this session 提示那些可能通
  • 为什么所有迭代器/迭代器适配器在 C++11 中都不可移动?

    In this https stackoverflow com questions 14302834 when to make a type non movable in c11讨论的问题何时在 C 11 中使类型不可移动我发现斯科特 迈耶
  • 建造者应该遵守里氏替换原则吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我通常会尝试确保我的对象实例符合里氏替换原则 http c2 com cgi wiki LiskovSubstitutionPrinciple
  • 在 Spring Boot 应用程序中使用 Azure KeyVault 作为数据库密码

    我正在开发一个应该部署到 Azure 的 Spring Boot 应用程序 使用以下依赖项 我设法将 KeyVault 中的机密用于敏感应用程序属性
  • 不使用 PHPUnit 测试受保护/私有方法时的代码覆盖率

    我知道可以使用反射或其他解决方法使用 PHPUnit 测试私有 受保护的方法 但大多数消息来源告诉我 这是not为类内部的私有方法编写测试的最佳实践 您应该像测试一个 黑匣子 一样测试该类 您只需通过比较输入与输出来测试预期行为 而不考虑内