2009-09-10 7 views
0

i ont ancien code qui na pas utiliser TDD maintenant je veux écrire un test pour une fonction qui ressemble à cesimulez une instance nouvellement créée?

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

depuis im pas beaucoup expirienced avec PHPUnit et les tests en général ma question est la suivante: comment puis-je me moquer de DB_PG? i essayé getMock() dans mon test, mais étant donné que la fonction utilise « nouvelle » pour obtenir une instance mon objet fantaisie est ignorée, ce qui est logique

donc je ne vois que 2 options

  1. certaines caractéristiques de PHPUnit je ne sais pas - ce qui est la raison pour laquelle je demande ici ^^
  2. je dois modifier l'ancien code - que je sais serait mieux

donc, tout le monde connaît une réponse pour l'option 1?

thx tous

+0

Comment configurez-vous ce test? Avez-vous lu cet article sur les doubles de test? Est-ce une fonction autonome, ou est-ce une méthode qui fait partie d'une classe plus large? À quoi ressemblent vos tests (using getMock)? –

+0

* Que voulez-vous dire par configuration? * ouais je connais cet article, mais je ne suis pas sûr de savoir quel est votre point ici? * sa fonction autonome je veux tester et un test il essayer d'obtenir l'exécution ressemble à cette fonction test_someFunctionFailed() {$ pgmock = $ this-> getMock ('DB_PG', array ('select')) $ pgmock-> s'attend à ($ this-> any()) -> méthode ('select') -> va ($ this-> returnValue (null)) $ rval = somefunction(); $ this-> assertNull ($ rval); } Actuellement, Erreur fatale: Appel à la méthode non définie DB_PG :: select() dans ... –

Répondre

1

OPTION 1

Pouvez-vous changer la fonction de travailler comme suit:

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

    $return $result; 
} 

De cette façon, vous pouvez passer dans une instance de db, ce qui vous permet d'au moins tester cette fonction, dans le futur vous pouvez refactoriser des choses telles que le travail de someFunc est sur des modèles, et le chargement de db se passe via un dao/repository/factory.

OPTION 2

Si DB_PG est pas déjà tiré via un besoin/inclure dans le fichier où cette fonction est présente, vous pouvez définir une classe fictive dans votre classe de test

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; 
    } 
} 

De cette façon, vous pouvez contrôler ce qui se passe avec le résultat.

Questions connexes