为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕斯709654 2022-08-05 16:03:41
我正在为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任何想法如何处理这种情况?
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

你可以做一些事情来避免嘲笑整个宇宙进行测试。

在这种特定情况下,创建一个可能已经足以让你更容易地注入/模拟东西。CassandraSessionFactory

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

例如,假设您有一个集合/表。而且您希望您的程序能够获取它们。然后,您将创建一个包含方法的接口。稍后,您将能够创建一个称为具体实现,该实现使用适当的扩展来实现此目的。PersonPersonRepositoryfetchBySomething(): PersonCassandraPersonRepository

有了这个,你可以通过仅模拟其接口来对需要的所有内容进行单元测试。并仅对连接进行合约测试PersonRepositoryCassandraPersonRepository

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

额外提示:使用预言而不是phpunit的模拟。更容易,甚至更快。

我希望这个答案是有用的:)


查看完整回答
反对 回复 2022-08-05
?
倚天杖

TA贡献1828条经验 获得超3个赞

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


查看完整回答
反对 回复 2022-08-05
  • 2 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信