2017-01-15 156 views
0

PHPUnit的3.7的PHPUnit:用於測試靜態方法

自從三星期,我正在使用PHPUnit進行測試,並做了很多簡單的單元測試(也有dataPrividers)的最佳實踐 - 我喜歡它。

最後的日子,我努力模仿對象 - 沒有成功:-(

我想測試下的靜態函數:Tools::getValue();它得到了一些對象和對象的屬性的名稱,做一些的東西,並給出了屬性的值了。我使用這種功能往往。

是否與getMock測試嗎?我沒有成功到現在和閱讀並沒有幫助。

# Tools.php 
<?php 
    class User 
    { 
    public $lastname, $city; 
    } 

    class Tools 
    { 
    /** 
     * Gets an attribute of my_object -> trimms the spaces and gives it back in uppercase. 
     * This work for any object/attribute. 
     * 
     * @param type $my_object 
     * @param string $attribute is a name of an attribute of my_object 
     * @return string 
     */ 
     public static function getValue($my_object, $attribute) 
     { 
     $value = $my_object->$attribute; 
     $ret = strtoupper(trim($value)); 
     return $ret; 
     } 
} 

而我牛逼的作品:

# use.php 
<?php 
$teacher = new User(); 
$teacher->lastname = "Kennwood"; 
$teacher->city = "New York"; 
echo Tools::getValue($teacher, "lastname"); 

// Result KENNWOOD 

而且測試也適用 - 但我認爲我的方式是不是在這種情況下確定:

# ToolsTest.php 
<?php 
class ToolsTest extends PHPUnit_Framework_TestCase 
{ 
    public function testGetValue() 
    { 
     $teacher = new User(); 
     $teacher->lastname = "Kennwood"; 
     $teacher->city = "New York"; 

     $actual = Tools::getValue($teacher, "lastname"); 
     $this->assertEquals("KENNWOOD", $actual);   
    } 
} 

它的工作原理,但壞事情是這樣的測試依賴於類User或我用另一個類來構建測試所需的對象 - 我認爲這不是一個好的測試設計。

我該如何嘲笑這個案例的對象,或者在這種情況下什麼是良好的測試實踐?

+4

你說你三週前開始用PHPUnit進行測試。爲什麼選擇多年不受支持的PHPUnit版本? –

+0

在我的Linux發行版中我有php 5.5.9,我正在使用composer來安裝phpunit,selenium,dbunit,... composer顯示衝突直到我選擇phpunit 3.7。當我現在升級我的整個開發IDE時,我必須進一步完成我的項目,並擔心時間問題。沒有好主意? – Didgejo

+1

PHPUnit 4.8支持PHP 5.3,PHP 5.4,PHP 5.5和PHP 5.6。 –

回答

0

好吧,我沒有找到其他解決方案,雖然我認爲我做測試的方式並不是很好 - 也許這是最好的解決方法。

在PHPUnit的-文檔,我發現:

限制:最終,私有與靜態方法

請注意,最後,私有和靜態方法不能存根或嘲笑

我不是很舒服,但對我來說,聽起來好像用PHPUnit不可能用靜態方法測試對象的依賴關係。

相關問題