2013-04-15 102 views
0

我有一個關於PHPUnit的問題,以及它如何鎖定對象,以及我是否以不正確的方式測試,或者它是否僅僅是PHPUnit中的某個東西。這是我的測試代碼PHPUnit鎖定對象

$t = Track::create(array('name'=>'test track')); 
$this->assertEquals(0, $t->student_tracks, 'Empty track should be empty'); 
$st = StudentTrack::create(array('track_id' => $t->id, 'completion'=>'0')); //Add item 
$this->assertEquals(1, $t->student_tracks, 'There should now be something in this track'); 

最後一個斷言失敗。數據庫中的所有內容看起來都正確,如果我print_r兩個對象($ t和$ st),它都會顯示正確的信息。尋找到這些問題後,我發現,如果我在第一個斷言前添加克隆它的工作原理:

$t = Track::create(array('name'=>'test track')); 
$cl = clone $t; 
$this->assertEquals(0, $cl->student_tracks, 'Empty track should be empty'); 
$st = StudentTrack::create(array('track_id' => $t->id, 'completion'=>'0')); //Add item 
$this->assertEquals(1, $t->student_tracks, 'There should now be something in this track'); 

所以我的問題是:

  1. 是否PHPUnit的鎖定對象等以後我不能用它一個斷言?

  2. 我測試錯了,我應該每個測試只有一個斷言?

在此先感謝。

+0

可以在測試中有多個斷言,但我認爲你的問題更多的是你期望$ t對象被修改,但StudentTrack工廠方法沒有通過$ t,所以它不太可能修改它。 –

回答

1

PHPUnit是否鎖定對象,所以我不能在斷言後使用它?

不.PHPUnit在這方面沒有做任何事情。

我是否測試錯誤,我應該每個測試只有一個斷言?

您可能測試錯誤,但不是因爲斷言的數量。每次測試可以有多個斷言,但實際上,在你的情況下,這有點像你想要使用Data Provider

class DataTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testStudentTracks($track, $expected, $message) 
    { 
     $this->assertEquals($expected, $track->student_tracks, $message); 
    } 

    public function provider() 
    { 
     return array(
      array(TrackTestCreator::createWithNoStudenTracks(), 0, 'Empty track should be empty'), 
      array(TrackTestCreator::createWithOneStudenTracks(), 1, 'There should now be something in this track'), 
     ); 
    } 
} 

測試中的一個關鍵點是讓它們保持簡單。例如。很可能你在創建對象時發生錯誤,所以你測試了一些你可能期望的東西,但是你不知道它是什麼。因此測試失敗。然後你感到困惑。

這就是爲什麼在我給出的例子中,我創建了兩個更全局的函數來說明它們返回的結果。你需要實現它們中的每一個,如果你這樣做是孤立的,你很可能找到錯誤。