2013-08-27 17 views
0

我试图学习如何在一般情况下进行单元测试,但具体而言,我正在使用的项目是使用CakePHP构建的。我的用户模型中有这个parentNode()方法,直接取自Simple Acl Controlled Application教程。CakePHP使用parentNode()方法测试用户模型

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()); 
} 

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

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

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

谢谢!

回答

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()); 
}