0

xdebug コード カバレッジでは、「return false;」という行が表示されます。(「! $ r」の下)私のテストではカバーされていません。ただし、$sql は基本的にハードコーディングされています。それについて報道するにはどうすればよいですか?「$table」をどうにかして上書きしますか? または、テストのこの部分でデータベース サーバーを強制終了しますか?

これはおそらく、私が自分のモデルをうまく書いていないことを示していると思いますよね? うまく検証できないからです。どうすればこれをよりうまく書くことができますか?

この1行がカバーされていないため、メソッド全体がカバーされておらず、レポートはオフになっています。

私はphpunitにかなり慣れていません。ありがとう。


public function retrieve_all()
{
    $table = $this->tablename();
    $sql     = "SELECT t.* FROM `{$table}` as t";
    $r         = dbq ( $sql, 'read' );

    if(!$r)
    {
        return false;
    }

    $ret = array ();

    while ( $rs    = mysql_fetch_array ( $r, MYSQL_ASSOC ) )
    {
        $ret[] = $rs;
    }


    return $ret;
}
4

2 に答える 2

1

理論的には、モデルとすべてのデータベース関連コードをより適切に分離する必要があります。

たとえば、Zend Framework のクイックスタート ガイドでは、次のことを推奨しています。

  • モデルクラス
  • モデルをデータベース モデルに「変換」する役割を持つデータ マッパー。
  • テーブルへの直接アクセスを行う DAO (またはテーブル データ ゲートウェイ)

これは非常に興味深いモデルです。ぜひご覧ください。モデルをデータから実際に分離できるため、モデル部分のみでテストを実行できます (データベースの問題/質問は気にしません)。

しかし、あなたのコードでは、完全なコード カバレッジを得るために、dbq() 関数が false を返すテストを実行することをお勧めします (おそらく "意図的に" db 接続を不可能にする)。

すべての「エラー ケース」をテストするには時間がかかりすぎる、この種の状況がよくあります。そのため、100% のコード カバレッジをあきらめています。

于 2010-03-17T15:07:26.353 に答える
0

dbq()関数がデータベースクエリを実行すると思います。データベース接続を切断して、テストを再実行するだけです。

テストに問題があるのは、グローバル リソース、つまりデータベース接続を使用しているためです。通常、接続オブジェクトをテスト メソッド (またはクラス) に提供することで、この問題を回避できます。

于 2010-03-16T15:11:33.127 に答える