PHPUnit:模拟除某些方法之外的所有方法

2024-03-03

我正在编写一个 PHPUnit 测试,我需要模拟一些依赖项,但我需要一些方法才能使其仍然像以前一样工作。即,我有:

class Dependency {
// some stuff not important for the test
  public function thisOneINeed() {
   /// complex code
  }
// some more stuff
}

所以我正在做这样的事情:

// prepare mock object
$dep = $this->getMockBuilder('Dependency')->disableOriginalConstructor()->getMock();
// mock out some other method that should return fixed value
$dep->expects($this->any())->method("shouldGetTrue")->will($this->returnValue(true));
// run test code, it will use thisOneINeed() and shouldGetTrue()
$result = $testSubject->runSomeCode($dep);
$this->assertEquals($expected, $result);

除了方法之外一切都很好thisOneINeed()被模拟出来了,所以我没有运行复杂的代码,我需要它运行runSomeCode()才能正常工作。该代码在thisOneINeed()不调用任何其他方法,但正确的测试需要它,并且它不返回固定值,因此我不能只将 static returnValue() 放在那里。并且 AFAIK PHPunit 没有类似的方法returnValue()上面写着“打电话给家长”。它有returnCallback()但据我所知,没有办法告诉它“为父类调用此方法”。

我可以列出所有方法Dependency, 消除thisOneINeed从它并将其传递给setMethods()在构建模拟时,但我不喜欢这种方法,看起来很笨拙。

我也可以这样做:

class MockDependency extends Dependency
{
    // do not let the mock kill thisOneINeed function
    final public function thisOneINeed()
    {
        return parent::thisOneINeed();
    }
}

然后使用MockDependency构建模拟对象,这也有效,但我不喜欢手动进行模拟。

那么有没有更好的方法来做到这一点呢?


我认为如果您想使用 PHPUnit 的模拟构建器,那么创建一个包含所有方法的数组,删除您需要的方法,然后将其传递给 setMethods 正是您需要做的。

我个人发现在很多情况下拥有 ReflectionClass 的子类很有用,我可以在需要时向其中添加方法。

class MyReflectionClass extends ReflectionClass
{
    public function getAllMethodNamesExcept(array $excluded)
    {
        $methods = array_diff(
            get_class_methods($this->name), 
            $excluded
        );
        return $methods;
    }
}

您还可以使用不同的模拟框架来支持您想做的事情。例如,Phake https://github.com/mlively/Phake has a 然后调用父级 http://phake.digitalsandwich.com/docs/html/ch04s02.html方法。我最近开始使用 Phake,因为我需要能够捕获传递给方法的参数。它有详细的文档记录,值得一试。

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

PHPUnit:模拟除某些方法之外的所有方法 的相关文章

  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • PHP实现的机票预订系统

    如何防止预订系统中的座位被重复预订 我正在用 PHP 和 MYSQL 制作一个航空旅行预订系统模型作为一个项目 我有一个小问题 仅在付款后 门票和座位详细信息才会永久存储在此处 座位号在付款前分配 假设人 1 预订了飞机上的座位 x 并支付
  • Ioncube 编码的文件是否可以解码?

    我是一名 php 开发人员 我的客户计划分发一个使用 Php 开发的软件 计划使用 ioncube 或类似软件对文件进行编码 在谷歌搜索时 我发现很少有人解码这些文件 这些文件使用 ioncube 甚至其他软件进行编码 如果您询问是否可以破
  • YouTube 数据 api 未按 viewCount 排序

    我正在尝试按 viewCount 从高到低排序 YouTube 频道视频 但结果并不是按最大观看次数排序 以下是我正在使用的 API https www googleapis com youtube v3 search key api ke
  • 使用内联查询进行单元测试

    我知道有几个问题与我的类似 Dapper 单元测试 SQL 查询 https stackoverflow com questions 20461553 dapper unit testing sql queries 测试简洁的查询 http
  • 如何使用 php 将 base64 解码的图像保存在文件系统中?

    我通过向我的 Web 服务发出 POST 请求来获取 Base64 编码的 JPEG 字符串 我想解码它并将其保存在文件系统中 我如何使用 PHP 5 3 来实现这一点 我能够使用 base64 decode 函数成功解码数据 如何将此解码
  • 如何在 Laravel 5 中通过键获取所有缓存项的列表?

    Laravel 中的 Cache 类具有 get itemKey 等方法来从缓存中检索项目 以及 Remember itemKey myData1 myData2 来将项目保存在缓存中 还有一个方法可以检查缓存中是否存在某个项目 Cache
  • mysqli::real_connect 和 new mysqli 对象在连接数据库方面有什么区别?

    我正在使用这种方法连接到mysql db this gt Con new mysqli this gt DB Server this gt DB User this gt DB Pass this gt DB DB 当我使用这种方法连接时有
  • Woocommerce 中的欧洲 GDPR 附加结帐验证复选框

    您好 我一直在尝试向我的 Woocommerce 结帐页面添加一个额外的条件复选框 该复选框与条款和条件相同 但包含有关新 GDPR 数据保护 的信息以及指向我的隐私政策的链接 他们必须在方框中打勾才能结帐 我一直在使用从此处找到的各种代码
  • php 中的 stackoverflow 上有这样的成就系统吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 从概念上讲 如何使用 PHP 和 MySQL 为网站编写一个成就系统 唯一真正的方法是不断执行 MySQL 查询来测试成绩等吗 您有两
  • java.lang.IllegalAccessError:预验证类中的类引用在运行测试项目时解析为意外实现?

    在实施项目工作正常之后 我使用第三方库 zxing 实施了项目 然后在我编写了一个测试项目对我的项目进行单元测试之后 运行测试项目后 主项目 类及其方法没有给出任何信息错误 但如果在主项目的该方法中使用任何 zxing 框架类 则会在运行时
  • Guzzle 中的“并发”到底是什么?

    我没有找到太多关于concurrency选项中Pool 如果这是可以在服务器上打开的 TCP 套接字数量 那么问题是 我可以使用多少并发来更快地处理请求 我有这个使用的例子Pool I am using Laravel this is ba
  • PHP file_exists() 对我不起作用?

    由于某种原因 下面的 PHP 代码将无法工作 我无法弄清楚 很奇怪的是 file exists 似乎没有看到图像确实存在 我已经检查以确保将良好的文件路径插入到 file exists 函数中并且它仍在运行 如果我将 file exists
  • 将 Node.js(用于实时通知)添加到现有 PHP 应用程序

    我有一个现有的 PHP 应用程序 我需要向其中添加实时通知 为了实现这一点 我安装了node js 打算添加socket io以实现所有实时功能 然而 尽管在过去的三个小时里研究并试图弄清楚如何将两者结合起来 但我发现自己并没有更接近于获得
  • 给定两个日期,在 PHP 中查找工作日数的最佳方法是什么?

    标题几乎是不言自明的 给定两个日期 使用 PHP 查找工作日数的最佳方法是什么 工作日为周一至周五 例如 我如何知道中间有 10 个工作日31 08 2008 and 13 09 2008 datefrom strtotime datefr
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样
  • 具有挑战性的问题 - 使用 PHP 对 XML 数据进行排序

    我有 xml 文件 其中包含大量产品数据 我需要根据我的字段 ProductRange 的数据对我的产品进行排序 ProductRange urldecode GET Range XML 文件数据
  • 我的设置未保存在 WordPress 主题选项页面中

    我正在尝试创建一个基于 WordPress 设置 API 的主题选项页面 当我在浏览器中检查 options php 页面时 例如http mysite com wordpress wp admin options php http mys
  • 为什么我的浮点数大于 1 时在 MYSQL 中存储为 .9999?

    我将进程时间作为 float 4 4 存储在 MySQL 数据库中 start time microtime TRUE things happen in my script end time microtime TRUE process t
  • 纯旧 PHP 对象 (POPO) 一词的确切含义是什么?

    我想了解一下波波 我搜索了 popo 发现它代表 Plain Old Php Object 但我不确定 Plain Old Php Object 的确切含义 我想知道什么是 popo 以及在哪里使用它 谢谢 普通旧 在此处插入语言 对象是一

随机推荐

  • Azure AD 与 sonarqube 集成

    我使用 nginx 反向代理在 https 上运行 sonarqube 这是我的 nginx 反向代理配置 server server name sonarqube mydomain co in access log var log ngi
  • ASP.net 模型视图演示器值得花时间吗?

    我这个周末正在阅读有关 ASP net MVP 模式的内容 似乎即使是最简单的任务也会花费太多精力 如果以 MVP 模式进行 回报似乎是在更大的项目中 但我想 如果我将会追随MVP 为什么不直接用 ASP net MVC 来做这个项目呢 我
  • 如果是 Chrome,请使用 WebP

    因为目前只有 Chrome 和 Opera 支持 WebP 所以我想知道是否可以针对这两个特定浏览器并将它们重定向以获取我网站的另一个版本 以便我可以帮助更快地优化我的网站下载速度 Thanks 我这样解决了这个问题 检查客户端是否在 Ac
  • 同时显示选项卡栏和列表操作栏。 (安卓蜂巢)

    有一种情况 我想在操作栏中同时使用选项卡栏和列表导航 文档说 我们可以将 Actionbar 置于列表导航模式或选项卡导航模式 有没有办法同时使用两者 任何指示 帮助 先感谢您 抱歉 您只能选择其中之一 话虽这么说 你可以使用android
  • Select2 4.0.x 多复选框 JS 插件

    我正在使用Select2控制与Select2 Multi checkboxes JS插件允许多复选框选择 以下演示显示该控件可以正常工作选择2 3 x http jsfiddle net wasikuss gx93rwnk http jsf
  • 如何以编程方式检查 iPhone 中是否安装了应用程序列表

    在我的应用程序中 我显示了应用程序列表 是否有可能发现 iPhone 中是否安装了应用程序数组 如果有可能 请有人快速提供相关代码来检查 iPhone 中是否安装了一系列应用程序 在过去你可以使用canOpenURL像这样的图书馆iHasA
  • .net 8 预览版 Linux 上托管的 Azure 应用服务无法启动,显然要求安装 8.0.0-rc

    最后 App Service 可以在 Linux 容器下的 NET 8 Preview 上运行 尚不支持 Windows 我创建了一个并部署了一个简单的应用程序 但容器没有启动 如下所示 2023 09 17T20 25 27 314076
  • Google 应用内支付:如何处理 Google 的回发 JWT

    也许这是一个愚蠢的问题 但我不是高级程序员 我有 已成功为我的应用程序设置应用内付款 但它只能工作 不使用回发 url 我已经在谷歌上搜索了很多个小时 试图自己解决这个问题 但没有 成功 希望有人能帮助我 我已经包含了脚本 处理发布数据这显
  • 创建模型时使用外键自动创建模型 - Django

    我正在我的网页上创建评论部分 并希望用户能够对评论投赞成票或反对票 我的模型是这样的 class Comment models Model owner models ForeignKey User body models TextField
  • Windows attrib 命令行程序不会删除只读属性?

    我使用 windows attrib 命令删除目录只读属性并将其设置回来 如下所示 attrib r C build attrib C build C build attrib r C build attrib C build R C bu
  • 原始浮点编码

    Update原来的问题不再是这个问题的适当问题 所以我将单独保留这个问题来演示我尝试 学到的内容和背景 很明显 这不仅仅是一个 Base64 变体 而且涉及更多一些 背景 我使用 python 3 x 进行编程主要是为了与开源程序 Blen
  • 在日期/时间调用方法

    我正在寻找一个modern在给定日期 时间执行给定方法的方法 ZonedDateTime尤其 我知道Timer类和Quartz库 如下所示 线程包括完整的解决方案 Java 在特定日期执行方法 关闭 https stackoverflow
  • 如何将 Firestore 数据库从 Google 存储桶导出到 Json 文件

    情况如下 我有一个 Firestore 数据库 我每天都会将其下载到 Google Cloud Storage Bucket 作为备份 如果我想在本地下载它 我使用这个命令gsutil m cp r gs BUCKET PATH DESTI
  • ngrx/data 实体数据服务

    尝试理解ngrx data实体数据服务示例here https ngrx io guide data creating entity data services 其中显示 创建实体数据服务 在展示该服务之后 文档继续展示如何在组件中使用 n
  • C++ 重载虚函数发出 clang 警告?

    clang 在编译以下代码时发出警告 struct Base virtual void get char e virtual void get char e int index struct Derived public Base virt
  • 如果 ID 存在则更新记录,否则插入值

    如果记录存在 我正在尝试更新值 否则将值插入数据库 然而 这是行不通的 我写了下面的代码 String sqlCheck Select from UAP dbo UAP EMPLOYEE where EMP EMPLOYEE ID empI
  • 在 XCode 5 中应用程序窗口预计在应用程序启动结束时有一个根视图控制器

    我使用 Single View 或 Master View 模板在新的 XCode 5 中创建的每个新项目都会给我错误 应用程序窗口预计在应用程序启动结束时有一个根视图控制器 但只有当 UIView 等对象添加到类中时才会出现错误 我一如既
  • 无法在 Visual Studio 2010 中调试 MVC 源代码

    我正在尝试使用 Microsoft 符号服务器在 Visual Studio 2010 中调试 MVC 源代码 我已经配置了调试选项 如下所示 我的项目面向 NET Framework 4 0 如中所述调试 NET Framework 的源
  • 如何在 CMake 中使用 c++20 模块?

    Clang http clang llvm org docs Modules html and MSVC http blogs msdn com b vcblog archive 2015 12 03 c modules in vs 201
  • PHPUnit:模拟除某些方法之外的所有方法

    我正在编写一个 PHPUnit 测试 我需要模拟一些依赖项 但我需要一些方法才能使其仍然像以前一样工作 即 我有 class Dependency some stuff not important for the test public f