如何模拟另一个类使用的全局函数和类

Dam*_*lsh 3 php testing phpunit unit-testing

我正在尝试编写一个测试,我的一个方法使用了一个全局函数web(),该函数采用(字符串)url,并创建并返回UrlHelper. 这为我的应用程序提供了一些辅助方法的快捷方式。(是的 DI 会更好,但这是在幼虫应用程序中......)

我正在尝试测试的方法使用这个全局助手来获取给定 url 的内容并将其与另一个字符串进行比较。

使用 phpunit,我如何拦截对 的调用web或创建,UrlHelper以便确保它返回给定的响应?代码看起来有点像下面

function web($url){
 return new \another\namespace\UrlUtility($url);
}
Run Code Online (Sandbox Code Playgroud)

...

namespace some/namespace;

class checker {
   function compare($url, $content){
       $content = web($url)->content();
       ...logic...
       return $status;
   }
}
Run Code Online (Sandbox Code Playgroud)

单元测试正在测试比较的逻辑,所以我想从web调用中获取预期的内容。我希望模拟/存根可以解决问题 - 但我不确定我是否可以点击这个全局函数或另一个未传入的类?

谢谢

OnI*_*IcE 7

您可以使用 Mockery 重载该类,然后更改该方法的实现。

$mock = \Mockery::mock('overload:'.HelperUtil::class);
$mock->shouldReceive('content')->andReturnUsing(function() {
    return 'different content';
});
Run Code Online (Sandbox Code Playgroud)