无法调用相关测试用例

问题描述:

我正在编写单元测试来测试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。

任何帮助,非常感谢。

谢谢!

您应该从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