免责声明:我是单元测试的新手,刚刚入门。话虽这么说,我知道 100% 并不总是可能的,但我很好奇是否有一种解决方案可以使用 if/else 语句来解决代码覆盖率,或者它们是否只是无法测试。 p>
功能:
public function getAll()
{
// Query table for all rows sorted by name
$select = $this->select();
$select->order('name ASC');
$rowset = $this->fetchAll($select);
// Validate and return row
if($rowset->current())
{
// Return rowset
return $rowset;
}
else { return false; }
}
单元测试
public function testCanGetAll()
{
// Try to get all states
$result = $this->model->getAll();
$this->assertNotNull($result);
$this->assertNotEquals(false,$result);
}
结果
如您所见,我无法覆盖 return false;
行。我能想到的测试它的唯一方法是重命名我的数据库表或类似的剧烈的东西。
是否有另一种方法可以使用 if/else 语句(这是相当常见的做法)编写函数,从而更容易实现代码覆盖?
[编辑] 也许最好不要检查函数中的结果,而只是返回它?无论调用此函数,都必须进行自己的检查吗?
public function getAll()
{
// Query table for all rows sorted by name
$select = $this->select();
$select->order('name ASC');
$rowset = $this->fetchAll($select);
// Return rowset whether valid or not
return $rowset;
}
最佳答案
创建一个结果不会返回任何行的数据库上下文,然后在第二个测试方法中在该数据库上下文中创建一行。
针对实际应用程序的数据库进行测试通常不是一个好主意
您应该克隆它进行测试,以便可以操作数据来测试应用程序如何响应不同的数据上下文。
--编辑----
遵循本指南可能会有所帮助:http://framework.zend.com/manual/ru/zend.test.phpunit.db.html
关于php - 如何在 PHPUnit 中实现 If/Else 的代码覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355597/