4

PHP CodeIgniter フレームワークを使用してアプリケーションを作成しています。拡張子PHPUnitで、CI_Unitを使用してアプリケーションをテストしようとしています。モデルをテストするために、PHPUnit ドキュメントで定義されている YAML データ プロバイダーを読み込もうとしていますが、エラーが発生します。データ プロバイダー オブジェクトをごまかすと、別のエラーが発生します。通常の PHP 配列を提供すると、期待どおりに動作します。

私は何を間違っていますか?これを行う正しい方法は何ですか?以下は私の結果です:

PHPUnit_Extensions_Database_DataSet_YamlDataSet以下の Yaml ファイルのオブジェクトを返すと、次のようになります。

データセット「クライアント」が無効です。

によって返されたオブジェクトをループしてPHPUnit_Extensions_Database_DataSet_YamlDataSetそれを返すと、次のエラーが発生します。

PHPUnit_Framework_Exception: 「models.php」も「models.php」も開けませんでした。/Users/eric/pear/share/pear/PHPUnit/Util/Skeleton/Test.php の 100 行目

通常の PHP 配列を指定すると、テストは問題なく実行されます。テストを実行するために使用するコマンドは次のとおりです。

phpunit モデル

以下は私の YAML ファイルの例です。

Clients:
    1:
        client_id: 1
        client_information: "info number 1"
        client_key: 48fb10b15f3d44a09dc82d
    2:
        client_id: 2
        client_information: "info number 2"
        client_key: 48fb10b15f3d44addd

PHP 5.3、PHPUnit 3.6.10、DBUnit 1.1.2、CodeIgniter 2.1.0、および CI 2.1.0 に関連付けられた CI_unit を使用しています。

編集: 私の models/Test.php ファイルが添付されています:

/**
 * test_add_client
 * @dataProvider add_client_provider
 */
public function test_add_client($client_id,$company_id,$software_id,$client_information,$client_key)
{
    $data = array('software_id' => $software_id,
                  'client_information' => $client_information,
                  'client_key'         => $client_key);
    try {
        $id = $this->_m->add_client($company_id,$data);
        $this->assertEquals(true, is_int($id));
    } catch (Exception $e){
        $this->assertEquals(true,false);
    }
}

public function add_client_provider()
{
    $result = new PHPUnit_Extensions_Database_DataSet_YamlDataSet(
        dirname(__FILE__)."/../fixtures/Clients.yml");

    // Case #1 returns this $result
    //return $result;

    foreach($result as $key => $value){
        if($key == 'Clients'){
            $substructure = $value;
        }
    }

    // Case #2 return the inner structure that is the table
    return $substructure;

    // Case #3 return an array of arrays
    $data = array(
                array(1,1,1,'test','text 2'),
                array(1,2,1,'test 3', 'test 3'));
    return $data;
}
4

2 に答える 2

5

Data Providersに関する PHPUnit のドキュメントで説明されているように:

データ プロバイダー メソッドは、配列の配列、またはインターフェイスを実装して反復ステップごとに配列を生成するpublicオブジェクトを返す必要があります。Iteratorコレクションの一部である配列ごとに、配列の内容を引数としてテスト メソッドが呼び出されます。

ソースコードに基づいて、Test.php次のようなものが必要なようです:

    /**
     * test_add_client
     * @dataProvider add_client_provider
     */
    public function test_add_client($data)
    {
        $company_id = 0;
        $id = $this->_m->add_client($company_id, $data);
        $this->assertEquals(true, is_int($id));
    }

    public function add_client_provider()
    {
        $result = new PHPUnit_Extensions_Database_DataSet_YamlDataSet(
            dirname(__FILE__)."/../fixtures/Clients.yml");          

        // Return the Clients data
        $clients = array();
        $tbl = $result->getTable('Clients');
        for ($i = 0; $i < $tbl->getRowCount(); $i++) {
            $clients[] = $tbl->getRow($i);
        }
        return $clients;
    }

PHPUnit は、データセット テーブルを配列の配列に直接変換する関数を提供する必要があるようですが、ちょっと見ただけでは何もわかりませんでした。

phpunit.xml私が知る限り、ファイルは無関係であり、質問から削除できます。

try/catchまた、PHPUnit テスト メソッドのブロックも必要ありません。PHPUnit が処理します。

your は定義されていないことに注意してください。その$company_idため、0 に設定しただけです。上記のメソッド引数と YAML データは上記のどちらとも完全には一致していないようですが、簡単に修正できるはずです。

メソッドにすぐに渡されるテスト関数に配列を渡すことadd_clientで、コードももう少し DRY になります。

于 2012-05-18T21:03:54.860 に答える