2014-03-24 69 views
0

我遇到了PHPUnit的情況。我有一個包含一個包含非類方法的php文件的類。在我的課上,我有一個調用該函數的方法。以下是我的設置示例。在phpunit中嘲諷非類方法

class foo 
{ 
    public function getInfo() 
    { 
     .... 
     $this->GetFunctions(); 
     $data = functionFromRequire(); 
     .... 
    } 

    public function getFunctions() 
    { 
     return require_once '/PATH/TO/FILE/functions.php'; 
    } 

} 

PHPUnit getMock只模仿類的功能。反正用PHPUnit來模擬非類函數? Google的結果似乎只能讓我嘲笑課堂功能。提前致謝!

+0

模擬getInfo()而不是?或者做一些事情來避免getFunctions()方法的特殊僞裝。 – markdwhite

+0

@markdwhite getInfo是我試圖單元測試的方法。我嘲笑調用getFunctions,所以它只是返回true。由於該功能不存在,導致測試失敗。 – Lazadon

+2

我的意思是模擬getInfo(),所以它返回一個合適的值,就像$ data由functionFromRequire()提供一樣。或者,重構避免getFunctions()完全可以以更可測試的方式完成。 – markdwhite

回答

1

簡而言之,PHPUnit沒有模擬我能找到的命名空間的功能。我做了一些重構,就像@markdwhite建議的那樣。我創建了一個包含舊文件的新類。然後在新創建的類中使用了magic __call()和call_user_func_array()php函數。由於有太多的命名空間函數需要手動重做。希望它可以幫助別人!

0

使用命名空間,你可以替換你的功能functionFromRequire爲你的getInfo測試。但是,如果在你的問題中明確要求文件,將會使這變得困難。

http://www.schmengler-se.de/en/2011/03/php-mocking-built-in-functions-like-time-in-unit-tests/

你可以用你的測試類在同一個名字,然後替換爲自己的functionFromRequire將返回一組值。只要不指定函數的名稱空間,就可以替換它,並且PHP將能夠正確處理它。