繁体   English   中英

是否可以在 PHP 中模拟 PECL 扩展?

[英]Is it possible to mock a PECL extension in PHP?

我正在为datastax cassandra 扩展开发一个包装器。

扩展的简单用法如下所示,它尝试连接到127.0.0.1:9042上的 Cassandra 服务器:

$connection = \Cassandra::cluster()->build()->connect(); // instance of \Cassandra\DefaultSession

显然它会出错,因为没有可用的正在运行的服务器。

我试图一步一步地模拟所有这些调用,但它不起作用。 使用 package mockery/mockery的主要问题是:

  • \\Cassandra\\Cassandra\\Cluster\\Builder\\Cassandra\\DefaultSession都定义为最终类
  • 所有类都已预加载,因此代理和部分模拟不起作用
  • 我不想在我的机器上运行 cassandra 服务器,因为它无法处理这么重的服务器,而且我想为我正在开发的包设置 CI

知道如何处理这种情况吗?

有几件事你可以做,以避免在你的测试中嘲笑整个宇宙。

在这种特定情况下,创建CassandraSessionFactory已经足以让您更轻松地注入/模拟事物。

不过,我建议将存储库职责分离到一个接口中,并进行特定于 Cassandra 的实现。

例如,假设您有一个Person集合/表。 并且您希望您的程序能够获取它们。 然后,您将使用fetchBySomething(): Person方法创建一个PersonRepository接口。 稍后您将能够创建一个名为CassandraPersonRepository的具体实现,它使用适当的扩展来实现这一点。

有了上面的内容,您可以通过仅模拟其接口来对需要PersonRepository的所有内容进行单元测试 并且仅对CassandraPersonRepository连接进行合同测试

查看这篇文章: https : //thephp.website/en/issue/clean-tests-with-php-and-phpunit/有两个部分对您的案例有帮助:“测试应该没有 I/O 操作”和“始终注入依赖项”。 它们展示了一种快速实现我刚才提到的方法。

额外提示:使用 Prophecy 而不是 phpunit 的 Mock。 更容易,甚至更快。

我希望这个答案有用:)

干杯!

您应该围绕 cassandra API 开发一个适配器,然后在测试中模拟/替换它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM