2012-08-15 123 views
0

我們來到了我們的項目變得太大而無法手動測試的地步,所以我們開始用單元測試來覆蓋它。現在我們正面臨着測試模型驗證過程的困境。Yii項目單元測試:驗證器

一方面,驗證模型的邏輯的一部分,因此需要對其進行測試,所以我們開始了類似下面繁瑣的測試:

public function testNameRequired() 
{ 
    $this->object->name = ''; 
    $this->assertFalse($this->object->validate(array('name'))); 

    $this->object->name = 'Franky'; 
    $this->assertTrue($this->object->validate(array('name'))); 
} 

但在另一方面,驗證(我的意思是內置)是框架的一部分,並且已經過測試,所以我們基本上正在測試靜態rules數組(並且它是跟蹤意外代碼修改的VCS的任務)。

我們也在考慮創建一些可重用的驗證器測試,它會接受rules數組,解析它並運行上面的測試,但它只是重寫框架測試。

所以問題是:

您是否在代碼中測試驗證? 如果你那麼怎麼做?

回答

3

我認爲你忽略了測試的想法:你不一定測試驗證代碼是否工作,但是如果你的驗證邏輯這樣做。

我建議你還是做所有的測試有兩個原因:

  • 萬一你忘了驗證的東西,它可能會變成你記得要驗證它,並發現其中的錯誤。
  • 測試有另一個目的:容易refactoring。這可能是因爲你或者其他一些以你的代碼結束的程序員會決定編輯它。如果測試已經就緒,那麼很容易確保新版本能夠正常工作。也不要認爲Yii的開發人員不會犯錯誤;)他們也只是人類 - 這取決於你信任其他人的程度。

如果您決定測試您的驗證我不會依賴於使用rules()的輸出 - 這應該是您正在測試的東西之一。

+0

我們確實信任框架,否則我們最終會測試一切)所以問題在於我們可以通過簡單的規則檢查獲得相同的效果。如果我們重構驗證,可能會創建自定義驗證器,我們會這樣做以便更改邏輯(不僅僅是重寫現有驗證器),所以我們還需要更改測試。再次,測試沒有給我們任何東西,但純文本變化警報。 – piSHOCK 2012-08-15 09:05:56

+0

即使採用這種方法,我認爲爲了確保您沒有忘記某些東西,仍然會更好地進行相互依賴的測試。像錯別字這樣簡單的事情可能會導致浪費大量時間([正如我以前發現](http://stackoverflow.com/questions/11279404/yii-active-record-cexistvalidator-doesnt-seem-to-do-什麼))試圖找出發生了什麼。如果你相信所有的驗證總是能夠按預期工作,代碼不會改變,並且你沒有忘記任何驗證,那麼我猜測驗證沒有意義。 – 2012-08-15 09:12:51

+0

讓我感到最後兩個斷言是:_code不會改變,並且你沒有忘記任何validation_可以通過在測試中創建'rules'數組並且將它與模型中的數據進行比較來測試。 (我們當然會測試我們的自定義驗證器) – piSHOCK 2012-08-15 09:19:15