首页 > 解决方案 > 是否可以在 PHP 中模拟 PECL 扩展?

问题描述

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

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

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

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

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

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

标签: phpunit-testingphpunitmockery

解决方案


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

在这种特定情况下,创建一个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。更容易,甚至更快。

我希望这个答案有用:)

干杯!


推荐阅读