Question

J'ai un ancien code qui n'utilisait pas TDD Maintenant, je veux écrire un test pour une fonction qui ressemble à ceci

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

puisque je ne suis pas très expérimenté avec phpunit et les tests en général Ma question est: Comment puis-je me moquer de DB_PG? J'ai essayé getMock () dans mon test, mais depuis que la fonction utilise "nouveau" obtenir une instance mon objet fictif est ignoré, ce qui a du sens

donc je ne vois que 2 options

  1. certaines fonctionnalités de phpunit que je ne connais pas - c'est la raison pour laquelle je demande ici ^^
  2. je dois modifier l'ancien code - ce qui, je le sais, serait mieux

Donc, quelqu'un connaît une réponse pour l'option 1?

thx all

Était-ce utile?

La solution

OPTION 1

Pouvez-vous modifier la fonction pour qu'elle fonctionne 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 base de données, ce qui vous permet au moins de tester cette fonction. À l'avenir, vous pourrez refactoriser des éléments tels que le travail de someFunc est basé sur des modèles, et que le chargement de la base de données se fait via un dao / repository / factory. .

OPTION 2

Si DB_PG n'est pas déjà inséré via un require / include dans le fichier où réside cette fonction, 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top