se moquer de l'instance nouvellement créée?
-
05-07-2019 - |
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
- certaines fonctionnalités de phpunit que je ne connais pas - c'est la raison pour laquelle je demande ici ^^
- 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
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.