CakePHP使用parentNode()方法测试用户模型

时间:2013-08-27 17:25:15

标签: php unit-testing cakephp phpunit cakephp-2.3

我正在努力学习如何进行单元测试,但具体而言,我正在研究的项目是使用CakePHP构建的。我的用户模型中的这个parentNode()方法直接来自Simple Acl Controlled Application教程。

public function parentNode() {
    if (!$this->id && empty($this->data)) {
        return null;
    }
    if (isset($this->data['User']['group_id'])) {
        $groupId = $this->data['User']['group_id'];
    } else {
        $groupId = $this->field('group_id');
    }
    if (!$groupId) {
        return null; // not tested
    } else {
        return array('Group' => array('id' => $groupId));
    }
}

我写了以下测试

public function testParentNodeHasNoUserDataOrId() {
    unset($this->User->id);
    unset($this->User->data);
    $this->assertNull($this->User->parentNode());
}

public function testParentNodeWithGroupIDInUserData() {
    $this->User->data['User']['group_id'] = 1;
    $this->assertEquals(array('Group'=>array('id'=>1)),$this->User->parentNode());
}

public function testParentNodeWithoutGroupIDInUserData() {
    $this->User->id = 1;
    unset($this->User->data['User']['group_id']);
    $this->assertEquals(array('Group'=>array('id'=>1)), $this->User->parentNode());
}

他们似乎都工作了。但是,我的代码覆盖率报告显示我没有测试return null;块中的if(!$groupId)。我无法弄清楚如何测试该线。

据我所知,它永远不会执行。如果我的User模型没有id且没有数据,则在第一个if块中返回null。如果我作弊并给用户一些假数据$this->field('group_id')仍然返回第1组(我认为should return false instead但它没有)

所以当你进行单元测试时,你必须测试一切吗?我怎样才能测试return null if(!$groupId)?如果有代码永远不会执行我应该删除吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想出了如何使用以下测试来测试“不可能”的场景

public function testParentNodeWhenUserHasNoGroupId() {
    $this->User->id = 1;
    $user = $this->User->read();
    $user['User']['group_id'] = 0;
    $this->User->save($user);
    $this->assertNull($this->User->parentNode());
}