PHPUnit: Test fonctionnels
Bonjour,
Je me demande quelle est la meilleur option pour tester plusieurs cas de figure.
Cas 1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public static function authenticate(Request $request, Application $app)
{
$device_id = $request->get('device_id');
$secret_code = $request->get('secret_code');
if ($device_id == null)
$app->abort(400, 'Device id missing');
if ($secret_code == null OR !is_numeric($secret_code))
$app->abort(400, 'Bad secret code');
$ret = $app['db']->fetchAssoc('
SELECT `t1`.`id`, `secret_code`
FROM `clients` AS `t1`
JOIN `payment_devices` AS `t2`
ON `clients_id` = `t1`.`id`
WHERE `t2`.`id` = ?', array($device_id));
if (!$ret)
$app->abort(404, 'User not found');
if (intval($secret_code) !== intval($ret['secret_code']))
$app->abort(401, 'Bad authentification');
return $app->json(array(
'id' => $ret['id']
));
} |
Cette fonction prend deux paramètres et indique si l'authentification est réussie.
Pour tester cette fonction deux solutions s'offrent à moi :
- Passer par une class intermédiaire qui fait office de "repository" et l'injecter dans la fonction.
A la place de la requête SQL j'aurai quelque chose comme "$repo->getClient(...)" Cela me permettra de mock l'accès BDD. - Utiliser une fixture importée par PHPUnit (dans ce cas un schéma et des données bdd connue à l'avance)
Cas 2
Code:
1 2 3 4 5 6 7 8 9 10
|
public static function editSecretCode(Request $request, Application $app)
{
[...]
$req_update = $app['db']->executeQuery('
UPDATE `clients`
SET `secret_code` = ?
WHERE `id` = ?', array($new_secret_code, $user_id));
[...]
} |
Cette fonction modifie un champ dans la table des clients.
Comment tester cette modification ?
Puis-je supposer que si la méthode ne renvoi pas d'erreur c'est que l'UPDATE a été fait ?
J'aimerais si possible éviter de passer par les fixtures PHPUnit qui ralentissent le code et sont plus longues à mettre en place et à maintenir.
Précisions
Toutes ces fonctions sont des méthodes de webservice, quelle est la meilleur façon de tester :
- Tester les appels comme un client le ferait et vérifier le retour
- Tester chaque élément interne et partir du postulat que si chaque élément interne fonctionne alors l'ensemble est cohérent
Merci pour votre aide