[英]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
都定义为最终类知道如何处理这种情况吗?
有几件事你可以做,以避免在你的测试中嘲笑整个宇宙。
在这种特定情况下,创建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.