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

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

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

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

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

我试图一步一步地嘲笑所有这些调用,但它不起作用。对于软件包,主要问题是:mockery/mockery

  • \Cassandra,并且都定义为最终类\Cassandra\Cluster\Builder\Cassandra\DefaultSession

  • 所有类都是预加载的,因此代理和部分模拟不起作用

  • 我不想在我的机器上运行cassandra服务器,因为它无法处理如此繁重的服务器,而且我想为我正在开发的软件包设置一个CI

任何想法如何处理这种情况?


慕斯709654
浏览 106回答 2
2回答

BIG阳

你可以做一些事情来避免嘲笑整个宇宙进行测试。在这种特定情况下,创建一个可能已经足以让你更容易地注入/模拟东西。CassandraSessionFactory不过,我建议将存储库的职责分离到一个接口中,并制作一个特定于Cassandra的实现。例如,假设您有一个集合/表。而且您希望您的程序能够获取它们。然后,您将创建一个包含方法的接口。稍后,您将能够创建一个称为具体实现,该实现使用适当的扩展来实现此目的。PersonPersonRepositoryfetchBySomething(): PersonCassandraPersonRepository有了这个,你可以通过仅模拟其接口来对需要的所有内容进行单元测试。并仅对连接进行合约测试。PersonRepositoryCassandraPersonRepository看看这篇文章: https://thephp.website/en/issue/clean-tests-with-php-and-phpunit/ 有两个部分对你的情况有帮助:“测试应该没有I / O操作”和“始终注入依赖关系”。他们展示了实现我刚才提到的快速方法。额外提示:使用预言而不是phpunit的模拟。更容易,甚至更快。我希望这个答案是有用的:)

倚天杖

您应该围绕cassandra API开发一个适配器,然后在测试中模拟/替换它。
打开App,查看更多内容
随时随地看视频慕课网APP