2

私は PHP 単体テスト (PHPUnit を使用) と CakePHP(2) をフレームワークとして使用するのはまったく初めてで、5 年ぶりに PHP に戻ってきました。

私はウェブサイトを立ち上げて稼働させており、ベストプラクティスに従って単体テストを書いています。ただし、xdebug は、私がそれを呼び出していると信じているときに、私の句の 1 つがカバーされていないことを示しており、その理由がわかりません。考えられるすべての検索用語を徹底的にグーグル検索し、クックブックの関連セクションを再読しましたが (他にも多くの有用なことを学びましたが) 答えが見つからなかったので、それを望んでいます簡単な答えは、知っている人から来ています:)

コードの関連セクションは次のとおりです。

コントローラ:

<?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" を参照すると、要求データがなかったことを示すフラッシュ メッセージ (Loading data) が表示されるので、$client. 正しいデータが編集フォームに表示されます。

テスト内から呼び出すと、テストに合格したことを示す成功メッセージが表示されますが、xdebug コード カバレッジは、if (!$this->request->data) { .. }句がカバーされていないことを示しており、明らかなエラーはありません。

これは私には直感に反するように思われるので、将来の (より複雑な) 単体テストでのフラストレーションを回避するために、ページの通常のアクセス中に呼び出されたときにテストに合格するが、この句を実行しない理由を誰でも説明できますか?

(フィクスチャは、データ構造と、編集を試みる前のデータの挿入の両方の点で正しいです。ID のないテスト ケースまたは無効な ID を使用して edit() を呼び出すと、関連する句が正しく実行されます。検証に合格しません。)

4

1 に答える 1

0

同様の問題があり、testAction() に 2 番目のパラメーターを追加して解決しました。

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

また、変更したい場合があります

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

に:

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

それが役に立てば幸い。

于 2013-09-20T13:39:55.657 に答える