如何对这个PHP函数进行单元测试和重构?
免责声明:是的,我已经阅读了常见问题,并认为这样的问题存在于Stackoverflow的边界之内。不,我不知道如何正确命名( 我的问题很简单:如何单元测试以下方法,以及我应该做什么重构以使其可测试?我重复:我不想要求DB和Yii应用程序实例四处浮动来测试此函数如何对这个PHP函数进行单元测试和重构?,php,unit-testing,yii,Php,Unit Testing,Yii,免责声明:是的,我已经阅读了常见问题,并认为这样的问题存在于Stackoverflow的边界之内。不,我不知道如何正确命名( 我的问题很简单:如何单元测试以下方法,以及我应该做什么重构以使其可测试?我重复:我不想要求DB和Yii应用程序实例四处浮动来测试此函数 public function getOrderCountGroupedByStatus() { $arr = $this->db->createCommand() ->select('COUNT
public function getOrderCountGroupedByStatus()
{
$arr = $this->db->createCommand()
->select('COUNT( status ) AS count_status, status')
->from('order_item')
->group('status')
->order('status')
->queryAll();
$orderItemsCountByStatus = array();
foreach($arr as $os)
$orderItemsCountByStatus[(int)$os['status']] = $os['count_status'];
return $orderItemsCountByStatus;
}
这是通过手动测试整个应用程序来检查遗留代码的有效性
它来自基于PHP的应用程序
$this->db
是一个对象。$this->db->createCommand()
返回一个对象
CDbCommand.queryAll()
返回iterable对象,该对象在每次迭代时发出数组array('status'=>(string),'count\u status'=>(int))
这种方法显然有两个职责:第一个职责是从外部数据源获取原始数据,第二个职责是将原始数据重新排列为最终结果。我理解应该以某种方式将其分离
public function CanFindNumberOfOrdersGroupedByStatus()
我被困在这里的主要原因是,我测试的基本上是SUT是否能够成功地从持久性存储获取一些统计信息,仅此而已。与DB的所有交互都是这里的实现细节,但在我使用的遗留代码库中,它是连接到持久性存储的唯一方法(使用上面的CDbCommand/CDbConnection组合)这个持久性存储是一个MySQL数据库
我想知道是否需要为CDbConnection实现完整的后端,它将与内存中的fixture而不是真正的DB一起工作,以正确地对这些方法进行单元测试
是的,为了防止可能出现的问题,项目政治禁止使用Yii框架中内置的ActiveRecords。您根本不需要编写太多代码来测试这一点。Yii有一个优秀的测试框架,包括DB测试和DB fixture功能,可以完美地覆盖这一遗留功能
public function getOrderCountGroupedByStatus()
{
$arr = $this->db->createCommand()
->select('COUNT( status ) AS count_status, status')
->from('order_item')
->group('status')
->order('status')
->queryAll();
$orderItemsCountByStatus = array();
foreach($arr as $os)
$orderItemsCountByStatus[(int)$os['status']] = $os['count_status'];
return $orderItemsCountByStatus;
}
请阅读:
(另请参见其中有关固定装置的章节)
通常情况下,您最终要做的是:
设置一个单独的测试数据库并简单地测试已知的结果?@IvoRenkema Man,我在这里谈论的是
单元
测试。整个问题是根本不要使用真正的数据库,否则每个人都知道如何测试这样的函数。我已经回答了一位评论者,回答了你同样的问题:我不需要也不想提出整个MySQL实例实例化Yii应用程序只是为了测试这个功能。我想要单元测试,而不是集成测试。谢谢你,我完全知道如何使用Yii设置DB测试,已经完成了。