私は 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() を呼び出すと、関連する句が正しく実行されます。検証に合格しません。)