0

TDD を使用していない古いコードがあり、次のような関数のテストを書きたい

function somefunction($someargs){
    // do a few checks on $someargs
    $database = new DB_PG();
    $result = $database->select($query);
    // do some changes on result
    return $result;
}

私はphpunitと一般的なテストにあまり慣れていないので、私の質問は次のとおりです。DB_PGをモックするにはどうすればよいですか? テストで getMock() を試しましたが、関数は「new」を使用してインスタンスを取得するため、モックオブジェクトは無視されます。これは理にかなっています

だから私は2つのオプションしか見ていません

  1. 私が知らないphpunitのいくつかの機能 - それが私がここで尋ねる理由です^^
  2. 私は古いコードを変更する必要があります - 私はそれがより良いと知っています

だから、誰かがオプション1の答えを知っていますか?

thxすべて

4

1 に答える 1

1

オプション1

次のように機能を変更できますか?

function someFunc($existingArgs, $db = null)
{
    $db = (is_null($db)) = new DB_PG();
    $result = $db->select($query)

    $return $result;
}

このようにして、dbインスタンスを渡すことができます。これにより、少なくともこの関数をテストできます。将来的には、someFuncの作業がモデルで行われるようにリファクタリングでき、dbの読み込みはdao / repository/factoryを介して行われます。

オプション2

DB_PGが、この関数が存在するファイルのrequire / includeを介してまだプルされていない場合は、テストクラス内にダミークラスを定義できます。

class DB_PG
{
    public function select($query)
    {
        //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
        return $mockResult;
    }
}

そうすれば、結果で何が起こるかを制御できます。

于 2009-09-10T16:57:54.540 に答える