2017-02-09 68 views
2

我想寫一個測試,我的一個方法使用全局函數web(),它需要一個(字符串)url,並創建並返回新實例UrlHelper 。這給我的應用程序一些幫助器方法的快捷方式。 (是DI會更好,但這是在一個更大的應用程序...)如何模擬其他類使用的全局函數和類

我試圖測試的方法,使用此全局助手獲取給定的網址的內容,並將其與另一個字符串進行比較。

使用phpunit,我如何攔截電話web或創建UrlHelper,所以我可以確保它返回給定的響應?代碼看起來有點像下面

function web($url){ 
return new \another\namespace\UrlUtility($url); 
} 

...

namespace some/namespace; 

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

單元測試是測試比較的邏輯,所以我想從web通話預期的內容。我希望mocks /存根可以做到這一點 - 但我不確定是否可以打這個全局函數或其他沒有通過的類?

感謝

+2

看一看這個http://stackoverflow.com/a/6154470可能需要使用PHP擴展 – OnIIcE

回答

3

您可以使用Mockery重載該類,然後更改該方法的實現。

$mock = \Mockery::mock('overload:'.HelperUtil::class); 
$mock->shouldReceive('content')->andReturnUsing(function() { 
    return 'different content'; 
}); 
+0

brill,正是我想要的=) –

+0

它對我很好。但是,需要注意的是,您需要使用自動加載(不需要)才能正常工作。 – Franco

1

可以髒重新申報在測試中,將優先考慮您的命名空間中的全局函數。

注意:它很髒。

+1

這種技術還可以用來「局部覆蓋」一個PHP函數 - 這種非常有用調用爲'time()',用於phpunit-bridge/ClockMock.php –

相關問題