如何使用 mockery 来模拟没有命名空间的全局类?

Posted

技术标签:

【中文标题】如何使用 mockery 来模拟没有命名空间的全局类?【英文标题】:How to use mockery to mock global class without namespace? 【发布时间】:2015-09-17 12:56:30 【问题描述】:

我想测试调用此函数https://github.com/Automattic/WPCOM-Related-Posts/blob/master/wpcom-related-posts.php 的 WordPress 应用程序

我不确定如何模拟它,因为 WPCom_Related_Posts 没有命名空间。

这就是我使用类的方式

$related_posts = WPCom_Related_Posts()->get_related_posts( get_queried_object_id(), $args );    

我应该如何在测试中模拟这个get_related_posts,因为这个类会调用 Elasticsearch 来获取相关的帖子,我不想在 PHPUnit 中设置它

【问题讨论】:

【参考方案1】:

这很简单:就像你模拟任何其他类一样:

$mock = Mockery::mock('WPCom_Related_Posts');
//or, if you want to be explicit:
$mocl = Mockery::mock('\WPCom_Related_Posts');

关于这个的documentation along with examples 有很多,在第一页,例如:

$mock = \Mockery::mock('stdClass');

这应该回答了你的问题(stdClass 也没有命名空间(嗯,它在全局 NS 中)。

不要忘记在每次测试结束时运行\Mockery::close();(在tearDown_after 中,或者在您使用的测试框架中调用的任何名称中)。尤其是当你开始使用期望时

【讨论】:

以上是关于如何使用 mockery 来模拟没有命名空间的全局类?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mockery 来模拟 httpclient

如何使用 Mockery 模拟构造函数

Laravel 5 - 使用 Mockery 模拟 Eloquent 模型

如何使用 Mockery 模拟嵌套对象,如 GuzzleHttp 请求

如何使用 Mockery 在模拟方法的第 N 次调用中引发异常

在 Laravel 4 中使用 Mockery 模拟自定义类