我正在为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的实现。
例如,假设您有一个集合/表。而且您希望您的程序能够获取它们。然后,您将创建一个包含方法的接口。稍后,您将能够创建一个称为具体实现,该实现使用适当的扩展来实现此目的。Person
PersonRepository
fetchBySomething(): Person
CassandraPersonRepository
有了这个,你可以通过仅模拟其接口来对需要的所有内容进行单元测试。并仅对连接进行合约测试。PersonRepository
CassandraPersonRepository
看看这篇文章: https://thephp.website/en/issue/clean-tests-with-php-and-phpunit/ 有两个部分对你的情况有帮助:“测试应该没有I / O操作”和“始终注入依赖关系”。他们展示了实现我刚才提到的快速方法。
额外提示:使用预言而不是phpunit的模拟。更容易,甚至更快。
我希望这个答案是有用的:)
- 2 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消