2012-09-21 49 views
4

我剛剛開始使用PHPUnit和TDD。這個PHPUnit測試是否有意義(或者我正在測試框架/ PHP)?

其中,我不能真正回答這個問題:這是一個很好的測試嗎?我是否真的在測試我的代碼或已經測試過的東西(即框架或PHP本身)?

小例子,這是測試對象:

class DateMax extends Constraint 
{ 
    /** 
    * @var string 
    */ 
    public $limit; 

    /** 
    * @var string 
    */ 
    private $invalidLimit = 'Option "limit" should be a valid date/time string.'; 

    public function __construct($options = null) 
    { 
     parent::__construct($options); 

     if(false === strtotime($this->limit)) { 
      throw new InvalidOptionsException($this->invalidLimit, ['limit']); 
     } 
    } 
} 

我想測試InvalidOptionsException預計當無效的「限制」選項傳遞,否則$constraint->limit持有正確的值:

/** 
* @dataProvider getInvalidLimits 
* @expectedException InvalidOptionsException 
*/ 
public function testInvalidLimits($testLimit) 
{ 
    new DateMax($testLimit); 
} 

/** 
* @dataProvider getValidLimits 
*/ 
public function testValidLimits($testLimit) 
{ 
    $constraint = new DateMax($testLimit); 
    $this->assertEquals($testLimit, $constraint->limit); 
} 

/** 
* @return array[] 
*/ 
public function getInvalidLimits() 
{ 
    return array(array('invalid specification'), array('tomorr')); 
} 

/** 
* @return array[] 
*/ 
public function getValidLimits() 
{ 
    return array(array('now'), array('+1 day'),array('last Monday')); 
} 

所以問題是這是否有任何意義,或者我正在測試框架/ PHP本身?

回答

2

當然它有道理,因爲你重寫了Constraint類的構造函數,並且有可能會破壞它裏面的某些東西。因此,立足於你的構造邏輯基本上你要測試兩件事情:

如果調用父的使用相同的選項構造函數,一次(你可以使用Mock用於此目的
  1. 檢查,你不關心設置合適極限值,因此應在約束類)
  2. 檢查測試,如果適當的異常被拋出時,限制了錯誤值(例如空)

編輯:有些使用情況下第一場考試。有用的可能是這一個:

讓我們說在某個時刻,你想以這種方式擴展您的DateMax構造:

public function __construct($options = null) 
{ 
    $this->optionsWithDecrementedValues = $this->doWeirdThings($options); 

    parent::__construct($options); 

    if(false === strtotime($this->limit)) { 
     throw new InvalidOptionsException($this->invalidLimit, ['limit']); 
    } 
} 

但是比如你沒注意到方法「doWeirdThings」需要引用作爲參數。所以實際上它改變了$ options值,你沒有想到,但是第一次測試失敗了,所以你不會錯過它。