0

一般的に単体テストを行う方法を学ぼうとしていますが、具体的には、私が取り組んでいるプロジェクトは CakePHP で構築されています。Simple Acl Controlled Applicationチュートリアルから直接取得したユーザー モデルに、この 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());
}

そして、それらはすべて機能しているようです。ただし、私のコード カバレッジ レポートはreturn null;if(!$groupId)ブロック内で をテストしていないことを示しています。その行をテストする方法がわかりません。

私が知る限り、決して実行されません。User モデルに ID とデータがない場合、最初の if ブロックで null が返されます。少しごまかしてユーザーに偽のデータを与えると、グループ1が返されます(代わりにfalseを返す必要がある$this->field('group_id')と思いますが、そうではありません)

単体テストでは、いつすべてをテストする必要がありますか? どうすればテストできreturn null if(!$groupId)ますか? 決して実行されないコードがある場合、それを削除する必要がありますか?

ありがとう!

4

1 に答える 1

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());
}
于 2013-08-29T04:18:31.993 に答える