2010-08-19 5 views
0

J'essaie d'utiliser PHPUnit pour tester certaines méthodes de classe qui retournent SQL. Ces classes devraient fonctionner avec n'importe quel adaptateur Zend_Db, donc je voudrais que les tests fassent de même. Mes tests ressemblent un peu à ceci:Unité testant une classe qui renvoie SQL

public function testEtcGeneratesCorrectSQL() 
{ 
    $model = new ClassBeingTested(); 

    // do some stuff 

    $sql = $model->__toString(); 

    $this->assertEquals('SELECT foo.* FROM foo WHERE bar = 1', $sql); 
} 

le problème réside dans les différences d'échappement entre les adaptateurs. Si je lance ce test en utilisant pdo_mysql, je vais une erreur comme ceci:

--- Expected 
+++ Actual 
@@ @@ 
-SELECT foo.* FROM foo WHERE bar = 1 
+SELECT `foo`.* FROM `foo` WHERE `bar` = 1 

si j'utilise l'adaptateur SQLite:

--- Expected 
+++ Actual 
@@ @@ 
-SELECT foo.* FROM foo WHERE bar = 1 
+SELECT "foo".* FROM "foo" WHERE "bar" = 1 

alors quelle est la bonne chose à faire ici? Y at-il un moyen de désactiver l'échappement dans Zend_Db je peux allumer juste pour les besoins de ces tests? Dois-je coder en dur dans le type d'adaptateur, puis ajuster ma sortie attendue pour correspondre? Ou dépouiller les différents caractères de citation avant de faire l'assertion?

Répondre

2

Utilisez une constante plutôt que hardcoding soit un ensemble de citations, donc pour MySQL:

$this->assertEquals('SELECT ' . DB_QUOTE . 'foo' . DB_QUOTE . '.* FROM ' 
        . DB_QUOTE . 'foo' . DB_QUOTE . ' WHERE ' 
        . DB_QUOTE . 'bar' . DB_QUOTE . ' = 1'); 

Ce qui semble tout à fait horrible, mais il ne fonctionnera que si vous définissez DB_QUOTE en fonction du pilote que vous utilisez.

+0

Et puis, que se passe-t-il si vous voulez tester plus d'un pilote? Vous êtes obligé de le faire dans un nouveau processus PHP. Si vous vouliez aller avec cette idée, utilisez des variables car cela permettrait plus de flexibilité lors des tests ... – ircmaxell

+1

Merci à vous deux. Il semble que les adaptateurs ont une méthode getQuoteIdentifierSymbol(), donc je vais pouvoir mettre ceci dans une variable et l'inclure dans mes assertions –

Questions connexes