无法调用相关测试用例
问题描述:
我正在编写单元测试来测试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
所使用的实现,让它通过!我想这不是你想要做的测试。
您已经提供了正确的解决方案,但我不建议重复使用模型夹具。每个单元测试应该像实际一样独立。否则,您有第一次测试改变模型的风险,以至于干扰第二次测试。 – 2012-08-07 06:52:39
Darren和@DavidHarkness,谢谢你的回复。达伦,我只使用返回$结果,并确实将值传递给testGetStudent函数。但是,它会抛出一个错误,指出Zend_Db_Table_Row Object(...)与期望的类型“string”不匹配。尽管模型函数getStudent($ result)运行良好,并且可以通过Zend_Db_Table_Row Object格式获取rec_id,但由于此错误,断言失败。我错过了别的吗? – 2012-08-07 18:36:32
而对于getStudent()函数,我并不真正理解以这种方式实现的动机是什么。到目前为止,我正在创建模型对象,因此每次运行测试用例时,设置都会有一个干净的模型对象。如果你可以详细说明为什么当前的实现错误,为什么它应该按照你所做的方式来实现,那会很好。再次感谢。 – 2012-08-07 18:38:51