CakePHP单元测试代码覆盖率$ this-> request->数据子句未执行

时间:2013-06-18 15:41:28

标签: cakephp phpunit xdebug

我完全不熟悉PHP单元测试(使用PHPUnit)和CakePHP(2)作为框架,我将在5年后回到PHP。

我有一个网站正在运行,我正在编写单元测试,因为我最佳实践。但是,当我相信我正在调用它时,xdebug显示我的一个条款没有被覆盖,我只是看不清楚原因。我用谷歌搜索了我能想到的所有搜索词,并重新阅读了食谱的相关部分(虽然我已经学到了很多其他有用的东西)我没有找到答案,所以我希望一个简单的答案即将来自知道的人:)

以下是相关的代码部分:

控制器:

<?php

App::uses('AppController', 'Controller');

// app/Controller/ClientsController.php
class ClientsController extends AppController {

/* other functions */
 public function edit($id = null) {
            if (!$id) {
                    $this->Session->setFlash(__('Unable to find client to edit'));
                    return $this->redirect(array('action'=>'index'));
            }
            $client = $this->Client->findById($id);
            if(!$client) {
                    $this->Session->setFlash(__('Unable to find client to edit'));
                    return $this->redirect(array('action'=>'index'));
            }

            if ($this->request->is('post')) {
                    $this->Client->id = $id;
                    if ($this->Client->saveAll($this->request->data)) {
                            $this->Session->setFlash(__('Client has been updated.'));
                            return $this->redirect(array('action'=>'index'));
                    } else {
                            $this->Session->setFlash(__('Unable to update client'));
                    }
            }

            if (!$this->request->data) {
                    $this->request->data = $client;
                    $this->Session->setFlash(__('Loading data'));
                }
        }
}

测试:

<?php

// Test cases for client controller module
class ClientsControllerTest extends ControllerTestCase {

    public $fixtures = array('app.client');

    /* other tests */
        public function testEdit() {

            // Expect success (render)
            $result = $this->testAction('/Clients/edit/1');
            debug($result);
         }
    }
?>

代码按预期执行。如果我浏览到“/ Clients / edit / 1”,则显示我期望的flash消息(正在加载数据),表示没有请求数据,因此它是从$client加载的。编辑表单中显示正确的数据。

当我在测试中调用时,我得到一条成功消息,表明测试已通过,但xdebug代码覆盖率显示if (!$this->request->data) { .. }子句未被覆盖,并且没有明显的错误。

这对我来说似乎是违反直觉的,所以希望避免对未来(更复杂的)单元测试感到沮丧 - 任何人都可以解释为什么测试会通过但是在正常访问页面时调用它时不执行此子句?

(在我尝试编辑数据结构和插入数据之前,夹具是正确的。从没有id或无效id的测试用例调用edit()正确执行相关的子句,就像传递未通过验证的数据。)

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我通过向testAction()添加第二个参数来解决:

$this->testAction('/Clients/edit/1', array('method' => 'get'));

您也可以更改

if ($this->request->is('post') {
    ...
}
if (!$this->request->data) {
    ...
}

要:

if ($this->request->is('post') {
    ...
} else {
    ...
}

希望它有所帮助。