php - 是否可以在 PHP 中模拟 PECL 扩展?
问题描述
我正在为datastax cassandra extension开发一个包装器。
扩展的简单用法如下所示,它尝试连接到 Cassandra 服务器127.0.0.1:9042
:
$connection = \Cassandra::cluster()->build()->connect(); // instance of \Cassandra\DefaultSession
显然它会出错,因为没有可用的正在运行的服务器。
我试图逐步模拟所有这些调用,但它不起作用。使用 packagemockery/mockery
的主要问题是:
\Cassandra
,\Cassandra\Cluster\Builder
并且\Cassandra\DefaultSession
都被定义为最终类- 所有类都是预加载的,所以代理和部分模拟不起作用
- 我不想在我的机器上运行 cassandra 服务器,因为它无法处理如此繁重的服务器,而且我想为我正在开发的包设置一个 CI
知道如何处理这种情况吗?
解决方案
你可以做几件事来避免在你的测试中嘲笑整个宇宙。
在这种特定情况下,创建一个CassandraSessionFactory
可能已经足以让您更轻松地注入/模拟事物。
不过,我建议将存储库职责分离到一个接口中,并进行特定于 Cassandra 的实现。
例如,假设您有一个Person
集合/表。并且您希望您的程序能够获取它们。然后,您将创建一个PersonRepository
带有fetchBySomething(): Person
方法的接口。稍后您将能够创建一个名为的具体实现CassandraPersonRepository
,该实现使用适当的扩展来实现这一点。
有了上面的这个,您可以通过仅模拟其接口来对需要的所有内容进行单元测试。PersonRepository
并仅对连接进行合同测试。CassandraPersonRepository
查看这篇文章:https ://thephp.website/en/issue/clean-tests-with-php-and-phpunit/ 有两个部分对您的案例有帮助:“测试应该没有 I/O 操作”和“始终注入依赖项”。他们展示了实现我刚才提到的快速方法。
额外提示:使用 Prophecy 而不是 phpunit 的 Mock。更容易,甚至更快。
我希望这个答案有用:)
干杯!
推荐阅读
- c# - 以编程方式将 Razor 页面呈现为 HTML 字符串
- c# - MySql 错误 - 索引和长度必须引用字符串中的位置
- python - 如何计算keras模型中不同输入的不同损失
- c# - 我的项目模板中有一个按钮,我想对其进行编程,以便将我引导至特定的工作详细信息
- xtext - 如何在我的 Xtext 项目中使用已声明的 java 类型(类)
- aws-lambda - 在 aws lambda 上安装 azure-cli 包
- html - 如何在相同的属性上分别触发过渡,以及如何过渡渐变?
- batch-file - 使用 Windows 批处理脚本自动解压缩任务
- jira - 如何为单个项目的自定义字段的每个问题类型指定默认值?
- cookies - Cookie “PHPSESSID” 将很快被视为针对
因为方案不匹配