<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect2 id="zend.test.phpunit.db.adapter">
    <title>Utiliser l'adaptateur de tests</title>

    <para>
        Il peut être nécessaire quelques fois de vouloir tester l'application, mais sans base de données
        réelle physique. <classname>Zend_Test_DbAdapter</classname> offre des possibilités d'utiliser
        une implémentation de <classname>Zend_Db_Adapter_Abstract</classname> sans avoir à ouvrir une
        connexion vers une base physique. En plus, cet adaptateur est très facilement déguisable car
        aucun paramètre de constructeur n'est nécessaire.
    </para>

    <para>
        L'adaptateur de tests agit comme une pile pour des résultats de base. L'ordre des résultats
        doit être implémenté manuellement ce qui peut devenir assez complexe, mais cet adaptateur
        est très pratique dans le cas où un ensemble logique de requêtes est éxecuté et que vous
        connaissez l'ordre précis dans lequel les résultats doivent être retournés.
    </para>

    <programlisting language="php"><![CDATA[
$adapter   = new Zend_Test_DbAdapter();
$stmt1Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
$stmt1     = Zend_Test_DbStatement::createSelectStatement($stmt1Rows);
$adapter->appendStatementToStack($stmt1);

$stmt2Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
$stmt2     = Zend_Test_DbStatement::createSelectStatement($stmt2Rows);
$adapter->appendStatementToStack($stmt2);

$rs = $adapter->query('SELECT ...'); // Retourne Statement 2
while ($row = $rs->fetch()) {
    echo $rs['foo']; // Prints "Bar", "Baz"
}
$rs = $adapter->query('SELECT ...'); // Retourne Statement 1
]]></programlisting>

    <para>
        Le comportement des adaptateurs réels est simulé afin que des méthodes telles que
        <methodname>fetchAll()</methodname>, <methodname>fetchObject()</methodname>,
        <methodname>fetchColumn()</methodname> puissent fonctionner avec l'adaptateur de tests.
    </para>

    <para>
        Bien sûr, INSERT, UPDATE et DELETE peuvent être empilés aussi, mais vous ne pourrez alors tester
        que <methodname>$stmt->rowCount()</methodname> car ces types de requêtes ne retournent pas de
        résultats.
    </para>

    <programlisting language="php"><![CDATA[
$adapter = new Zend_Test_DbAdapter();
$adapter->appendStatementToStack(
    Zend_Test_DbStatement::createInsertStatement(1)
);
$adapter->appendStatementToStack(
    Zend_Test_DbStatement::createUpdateStatement(2)
);
$adapter->appendStatementToStack(
    Zend_Test_DbStatement::createDeleteStatement(10
));
]]></programlisting>

    <para>
        Par défaut, le profiler est activé pour que vous puissiez récupérer la requête éxecutée de manière
        textuelle, avec ses paramètres donc.
    </para>

    <programlisting language="php"><![CDATA[
$adapter = new Zend_Test_DbAdapter();
$stmt = $adapter->query("SELECT * FROM bugs");

$qp = $adapter->getProfiler()->getLastQueryProfile();

echo $qp->getQuerY(); // SELECT * FROM bugs
]]></programlisting>

    <para>
        L'adaptateur de test ne vérifie jamais si la requête spécifiée est réellement de type SELECT, DELETE,
        INSERT ou UPDATE. L'ordre exact de retour des données doit être spécifié manuellement dans l'adaptateur
        de tests.
    </para>

    <para>
        L'adaptateur de tests définit aussi les méthodes
        <methodname>listTables()</methodname>, <methodname>describeTables()</methodname> et
        <methodname>lastInsertId()</methodname>. De plus en utilisant
        <methodname>setQuoteIdentifierSymbol()</methodname> vous pouvez spécifier quel symbole
        utilisé pour l'échappement, par défaut aucun n'est utilisé.
    </para>
</sect2>
