2012-08-06 41 views
2

我正在編寫單元測試來測試Model類。 首先,我有一個testAddStudent()測試用例,它向db中添加了一些數據。 然後我有另一個測試用例來檢索我剛添加的記錄。 我的代碼如下所示:無法調用相關測試用例

class Model_STest extends PHPUnit_Framework_TestCase { 

protected $_student; 

public function setUp() { 
    error_log("Entered setup"); 
    parent::setUp(); 

    $this->_student = new Application_Model_Student(); 
} 

public function testInit() { 
    error_log("Entered testInit"); 
} 

public function testAddStudent() { 
    error_log("Entered testAddStudent"); 
    $testData = array(
      'name' => 'abc', 
      'teacher' => 'amyac', 
      'start_date' => '2012_08_06' 
      ); 

    $result = $this->_student->addStudent($testData); 
    error_log("result is ".print_r($result, true)); 
    $this->assertGreaterThan(0, $result); 
} 

/** 
* @depends testAddStudent 
*/ 
public function testGetStudent($result) { 
    error_log("Entered testGetStudent, finding student id: $result"); 
    $resultx = $this->_student->getStudent($result); 
    $this->assertEquals($result, $resultx); 
    } 

} 

然而,當我運行PHPUnit的測試(使用命令行),該日誌顯示我的學生證被搜索爲0。儘管testAddStudent將返回我學生ID是一個非零值。

我在做什麼錯? 我有

PHPUnit 3.6.11 by Sebastian Bergmann。

任何幫助,非常感謝。

謝謝!

回答

2

您應該從testAddStudent()函數返回$result

(從依賴式功能的返回值傳遞給函數不同)。

你也可以考慮做同樣的你的Application_Model_Student實例,而不是使用一個受保護的類變量。這是你的例子重寫,以表明這一點。 (我使用了一個虛擬的Application_Model_Student,它足以通過測試。)

class Application_Model_Student{ 
private $d; 
function addStudent($d){$this->d=$d;return 1;} 
function getStudent($ix){return $ix;} 
} 

//---------------------- 
class Model_STest extends PHPUnit_Framework_TestCase { 

public function testAddStudent() { 
    error_log("Entered testAddStudent"); 

    $testData = array(
      'name' => 'abc', 
      'teacher' => 'amyac', 
      'start_date' => '2012_08_06' 
      ); 

    $student = new Application_Model_Student(); 
    $result = $student->addStudent($testData); 
    error_log("result is ".print_r($result, true)); 
    $this->assertGreaterThan(0, $result); 
    return array($student,$result); 
} 

/** 
* @depends testAddStudent 
*/ 
public function testGetStudent($data) { 
    list($student,$result)=$data; 
    error_log("Entered testGetStudent, finding student id: $result"); 
    $resultx = $student->getStudent($result); 
    $this->assertEquals($result, $resultx); 
    } 

} 

P.S.請注意我爲getStudent所使用的實現,讓它通過!我想這不是你想要做的測試。

+0

您已經提供了正確的解決方案,但我不建議重複使用模型夾具。每個單元測試應該像實際一樣獨立。否則,您有第一次測試改變模型的風險,以至於干擾第二次測試。 – 2012-08-07 06:52:39

+0

Darren和@DavidHarkness,謝謝你的回覆。達倫,我只使用返回$結果,並確實將值傳遞給testGetStudent函數。但是,它會拋出一個錯誤,指出Zend_Db_Table_Row Object(...)與期望的類型「string」不匹配。儘管模型函數getStudent($ result)運行良好,並且可以通過Zend_Db_Table_Row Object格式獲取rec_id,但由於此錯誤,斷言失敗。我錯過了別的嗎? – 2012-08-07 18:36:32

+0

而對於getStudent()函數,我並不真正理解以這種方式實現的動機是什麼。到目前爲止,我正在創建模型對象,因此每次運行測試用例時,設置都會有一個乾淨的模型對象。如果你可以詳細說明爲什麼當前的實現錯誤,爲什麼它應該按照你所做的方式來實現,那會很好。再次感謝。 – 2012-08-07 18:38:51