如何测试工厂类?

2024-06-28

给定这个类:

class MyBuilder {
    public function build($param1, $param2) {

        // build dependencies ...

        return new MyClass($dep1, $dep2, $dep3);
    }
}

我如何对这个类进行单元测试?

单元测试意味着我想测试它的行为,所以我想测试它使用正确的依赖项构建我的对象。但是,那new指令是硬编码的,我无法模拟它。

现在,我添加了类的名称作为参数(这样我就可以提供模拟类的类名),但它很丑陋:

class MyBuilder {
    public function build($classname, $param1, $param2) {

        // build dependencies ...

        return new $classname($dep1, $dep2, $dep3);
    }
}

是否有一个干净的解决方案或设计模式可以使我的工厂可测试?


工厂本质上是可测试的,您只是试图对实现进行过于严格的控制。

您将检查是否通过以下方式获得了类的实例$this->assertInstanceOf()。然后,对于生成的对象,您将确保属性设置正确。为此,您可以使用任何公共访问器方法或使用$this->assertAttribute*PHPUnit 中可用的方法。

http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertEquals http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions.assertEquals

许多常见断言还能够检查受保护属性和私有属性的属性。

我不会在参数列表中指定类名,因为您的用法是工厂仅返回一种类型,并且仅更改依赖项。让它返回模拟对象类型是不必要的,并且会使您的测试更加复杂。

测试最终看起来像这样:

public function testBuild() {
    $factory = new MyBuilder();

    //I would likely put the following into a data provider
    $param1 = 'foo';
    $param2 = 'bar';

    $depen1 = 'boo';
    $depen2 = 'baz';
    $depen3 = 'boz';

    $object = $factory->build($param1, $param2);

    $this->assertInstanceOf('MyClass', $object);

    //Check the object definition
    //This would change depending on your actual implementation of your class
    $this->assertAttributeEquals($depen1, 'attr1', $object);
    $this->assertAttributeEquals($depen2, 'attr2', $object);
    $this->assertAttributeEquals($depen3, 'attr3', $object);
}

您现在要确保您的工厂返回正确的对象。首先确保它是正确的类型。然后确保它已正确初始化。

你依赖于MyClass为了通过测试,但这并不是一件坏事。您的工厂旨在创建MyClass对象,因此如果该类未定义,那么您的测试肯定会失败。

在开发过程中测试失败也不是一件坏事。

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

如何测试工厂类? 的相关文章

  • 多个 PHP 会话

    我要为一个网站构建一个 PHP 应用程序 该网站已经有另一个 PHP 应用程序在同一域 服务器上运行 我的应用程序当然会使用会话 并且我不希望我的会话干扰现有应用程序 例如 如果我想使用 SESSION username 也许其他应用程序也
  • 不支持的操作数类型

    我正在为网站开发购物车功能 并偶然发现了此错误 致命错误 第 xx 行 中不支持的操作数类型 我认为这可能是因为我正在数组中的变量和值之间执行一些数学运算 我不确定如何对数组中的值执行数学运算 line cost price quantit
  • 在 codeigniter 中找不到我的核心类 My_head

    我正在尝试在 codeigniter 中创建核心类 在 application core 中 我创建一个名为 MY head php 的文件 MY head php 的代码是 class MY head extends CI Control
  • Moq:对依赖 HttpContext 的方法进行单元测试

    考虑 NET 程序集中的一个方法 public static string GetSecurityContextUserName extract the username from request string sUser HttpCont
  • ModSecurity 提供通用 SQL 注入保护错误

    我的 Cpanel 服务器上出现此错误 并不是每次更新都会发生这种情况 只是某些 SQL 会发生这种情况 Sat Mar 11 03 48 18 409435 2017 error pid 31376 tid 140202228020992
  • 如何在单元测试期间验证某个 javascript 函数已被调用

    我正在使用 JsTestDriver 和一些 Jack 仅在需要时 有谁知道如何验证单元测试期间是否已调用 JavaScript 函数 E g function MainFunction var someElement or some ot
  • Android 本地测试与仪表测试

    我正在尝试检查我的 API 在单元测试中是否可用 以确保它响应 200 现在 我的问题是我不太确定何时使用本地测试当我必须使用时Android 仪器测试 我知道我必须使用 Instrumented Tests 进行 UI 测试 但如何测试端
  • 测试使用 Windows 身份验证的 Intranet 站点

    我正在尝试开发一个使用 Windows 身份验证的 Intranet 应用程序 网站 我想对多个用户 角色等进行测试 目前我只使用我自己的域帐户 有没有办法可以模拟该网站的不同用户 由于一张图片胜过一千个字 这里介绍如何在 IE 中基于2G
  • 致命错误:嵌套级别太深 - 递归依赖?

    我有一个复杂的嵌套对象层次结构 所有子对象 在父类中存储了一个对象数组 都包含链接回其父级的属性 相当简单明了 没有真正的问题 如果我对层次结构中的任何对象执行 var dump 我将在转储中获得递归引用 正如我所期望的那样 FIRSTGE
  • 开源在线 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 SELECT 查询中获取行数?错误:mysqli_affected_rows() 期望参数 1 为 mysqli,给定对象

    我正在努力对表单进行服务器端验证 使用 AJAX 表单将 用户名 输入字段中的值发送到我的 php 页面 然后检查该用户名是否已存在于数据库中 这是我的 php 代码 result mysqli query dblink SELECT FR
  • 通过 WooCommerce 注册时将完整的电子邮件地址设置为用户名

    设置 帐户下的 WooCommerce 有一个名为 根据客户电子邮件自动生成用户名 但它生成的用户名不是完整的电子邮件地址 email protected cdn cgi l email protection becomes myemail
  • Hudson、C++ 和 UnitTest++

    有谁用过吗Hudson http hudson dev java net 作为 C 项目的持续集成服务器 使用单元测试 http unittest cpp sourceforge net 作为测试库 你具体是怎么设置的 我知道之前有几个关于
  • PHP:强制转换为(数组)和返回类型:数组不一样吗?

    我在 PHP 中遇到以下问题 print r 说是一样的gettype 说相同的类型 但最后的输出不适用于这两种情况 尽管它们应该是相同的 这对我来说看起来很奇怪 代码和输出 docdatau get object vars json de
  • 使用PHP检测哪个htaccess用户登录?

    我正在构建一个上传功能 以便我认识的人可以安全 轻松地向我发送文件 但我想这样设计 当我的一个朋友用their登录 这将是 htaccess登录 我可以在 PHP 中建立该文件并将其文件记录到与其帐户关联的数据库中 简而言之 我需要 PHP
  • 可以用 PHP 设置表单字段值吗?

    我使用 GET 函数从 url http index html variable value 中提取一个带有 php 的值 这是基本的东西 但是 我需要在我的表单中使用该值 通常 我会设置 或类似的东西 但是 我无法使用我正在使用的编辑器在
  • 当用户使用 Internet Explorer 时重定向到新页面

    我使用下面的代码将使用 Internet Explorer 的用户重定向到新页面 但显然代码有问题 因为当我使用 Internet Explorer 时该网站不再加载 这是代码 由于我不知道我做错了什么 如果有人可以发布使用正确编码的正确方
  • codeigniter 分页错误[重复]

    这个问题在这里已经有答案了 在模型 rci model php中 public function record count return this gt db gt count all produk public function fetc
  • 如何用PHP识别google/yahoo/msn的网络爬虫?

    AFAIK SERVER REMOTE HOST 应该以 google com 或 yahoo com 结尾 但这是最有保障的方法吗 还有其他出路吗 您通过以下方式识别搜索引擎用户代理和IP地址 http www jafsoft com s
  • 将静态站点生成器与 php 集成

    我目前正在使用 php 构建一个不需要定期更新的网站 并且我考虑使用静态站点生成器 因为它将具有类似博客的功能 然而 我的网站包含一个将与数据库链接的表单 我遇到的问题是静态站点生成器无法识别和解析 php 我目前正在考虑使用三个静态站点生

随机推荐

  • jquery getJSON 跨域问题

    使用 JQuerys getJSON 从另一个域拉入 JSON 文件时 我似乎无法使该文件正常工作 我已经将回调部分放在了 url 的末尾 但仍然没有任何乐趣 Firebug 告诉我这是一个跨域问题 这似乎是有道理的 就好像我将 json
  • 如何在 javascript 中用正则表达式替换特殊字符?

    我需要替换字符串中的特殊字符 如下所示 this value this value replace n g 除了正则表达式部分之外 我需要它来查找opposite所有这些 0 9 查找 0 到 9 中的任意数字 A Z 查找从大写 A 到大
  • OpenAI GPT-4 API:为什么 gpt-4-0613 会幻觉(弥补)函数参数?

    我正在使用gpt 4 0613模型 功能单一 还有系统提示中的一些自定义数据 如果该函数在聊天中很早就被触发 在前两个请求内 它的功能就很好 并且 API 会要求用户提供调用该函数所需的信息 但是 如果稍后在对话中调用该函数 例如问题 5
  • 批处理文件和脚本中的腻子?

    我有一个批处理文件 可以很好地打开腻子 c putty exe 电子邮件受保护 cdn cgi l email protection pw boyhowdy 但为了让这项工作对我有用 我需要了解如何包含命令脚本 以便它可以在 putty 工
  • R:在 glm() 中的逻辑回归中预测 (0,1)

    我正在尝试在二进制 Logit 模型中模拟 假设 情况 我正在估计通过测试的概率 考虑到测试的难度级别 1 最简单 5 最难 并以性别为控制 数据是here http dl dropbox com u 1791181 bayesglm cs
  • Apache Cordova 工具 (VS2015):将自定义条目添加到 iOS 的 *info.plist

    我正在 VS2015 上使用 Apache Cordova 工具来开发一个项目 我需要在 info plist 文件中设置一些附加选项 以便暂时解锁 HTTP Web 访问 NsAppTransportSecurity 并启用地理定位服务在
  • 关闭时发送到托盘

    单击关闭按钮时如何将最小化的窗口发送到托盘 另外 如何在应用程序启动时在托盘中显示图标 WinForm 一种方法是在窗口的 F ormClosing 事件中设置 FormClosingEventArgs 的 Cancel 属性 然后最小化到
  • HAML:form_tag 困境(缩进?)

    我正在制作 用户设置表单 并坚持使用 HAML form tag 1 2 3 each do i check box tag accept i submit tag 这会导致 语法错误 意外的 kENSURE 期望 end 工作变体是 fo
  • React JS Web 代码可以用于使用 React Native 构建移动应用程序吗?

    我正在开发一个宠物项目 Web应用程序 我想知道我是否应该使用React 因为从这段代码创建本机应用程序很容易 将来如果我需要的话 如果答案是肯定的 那么应遵循的最佳实践是什么 最重用 如果答案是否定的 您能推荐一个替代方案吗 有关我的情况
  • 如何在cypress中逐页浏览?

    我的网站中有 ajax 表 并且该表有很多页面 我的目标是遍历所有行和列 转到下一页并执行以下过程 直到页面末尾 我有以下代码 for let i 0 i lt 10 i cy get tr has td each tr rowIndex
  • 资源分叉、Finder 信息或类似的碎片不允许 Xcode 8 错误? [复制]

    这个问题在这里已经有答案了 我在 Xcode 8 中运行旧项目时收到错误 在 Xcode 7 中运行的同一项目完全流量较少 我还应用以下链接中提到的解决方案 macOS Sierra Xcode 8 中的代码签名错误 不允许资源分叉 Fin
  • 在 ASP.NET 回发时保持水平和垂直滚动位置

    编码采用 ASP NET C 我有一个 gridview 有 1000 条记录 我正在内联编辑其中一行 单击 更新 时 我希望我的网格位于回发发生之前的确切 x y 位置 如果您正在考虑使用 Page 指令 MaintainScrollPo
  • Angular 为多个根路径重用相同的延迟加载模块

    我将我的应用程序分成两个模块 一个具有主要的基本功能 另一个具有较少使用的功能 例如帐户设置 常见问题解答页面等 我想要完成的是延迟加载某些根路由路径的第二个模块 例如 account or settings无需创建许多不同的模块 据我所知
  • apache2如何允许跨域请求

    这是我的配置文件
  • 使用 Gradle 将 Lint 结果发布到 Sonar

    我正在尝试使用 Gradle 将 Lint 结果发布到声纳服务器 其他分析结果已发布 但 Lint 结果未发布 有谁有让这个工作的经验吗 我找不到任何附加信息 声纳的版本是3 5 1 Gradle的版本是1 10 顶层构建文件如下所示 有
  • 在 matplotlib 中在图像上绘制网格线

    如何在 tiff 图像上绘制规则网格线 我想在图像上的每个间隔 例如 100 x 100 像素 绘制规则的方形网格 并将其与绘图一起保存 我还需要将每个网格 ID 覆盖为 1 2 在每个网格框的中间 您需要安装 python 成像库 PIL
  • 通过 JavaScript 选择 CascadingDropDown 中的项目并调用更新

    在代码隐藏中 我可以这样做来选择某些内容 Select item in first DropDownList myCascadingDropDown 1 SelectedValue itemValue 1 itemText 1 Select
  • 构造稀疏矩阵后,从稀疏到密集再到稀疏的转换会再次降低密度

    我使用 scipy 生成稀疏有限差分矩阵 最初从块矩阵构建它 然后编辑对角线以考虑边界条件 得到的稀疏矩阵是BSR类型的 我发现如果我将矩阵转换为稠密矩阵 然后使用以下命令返回稀疏矩阵scipy sparse BSR matrix函数 我留
  • 登录 WordPress 后重定向

    我正在根据现有网站创建自定义 WordPress 主题 我想使用我创建的备用仪表板 我怎样才能将用户定向到 news php 登录后而不是 wp admin EDIT 为此有一个可用的插件 但任何可以通过functions php找到手动方
  • 如何测试工厂类?

    给定这个类 class MyBuilder public function build param1 param2 build dependencies return new MyClass dep1 dep2 dep3 我如何对这个类进行