2010-07-12 6 views
0

J'essaye d'écrire quelques tests avec PHPUnit pour nos diverses classes/méthodes/fonctions. Certains d'entre eux nécessitent une connectivité à la base de données. Évidemment, je voudrais Mock ceux-ci, afin que je ne change pas notre base de données (s). Est-ce que quelqu'un peut me diriger vers un code qui explique comment faire cela? Je vois beaucoup d'exemples de Mocking, mais rien de spécifique à propos de la base de données.Mocking une connexion de base de données

Répondre

3

En général, vous ne voulez pas vous moquer de la base de données ou de toute autre dépendance externe similaire. Il est préférable d'envelopper la base de données dans votre code avec quelque chose d'autre, et vous pouvez ensuite vous moquer de l'encapsuleur. Étant donné qu'une base de données peut interagir de différentes manières, alors que votre code et vos tests ne tiennent compte que d'un ou deux, votre encapsuleur de base de données n'a qu'à les implémenter. Ainsi, se moquer de l'emballage devrait être assez simple. Vous aurez également besoin d'un test d'intégration sur le wrapper pour vérifier qu'il fait ce qu'il est censé faire, mais il n'y aura que quelques-uns de ces tests pour ne pas trop ralentir vos tests unitaires.

+0

Je suppose que « se moquant de la base de données » est le mauvais terme. Nous utilisons ezSQL en interne, et je veux me moquer d'elle, pour pouvoir tester tout le reste ... –

0

Mock de base de données

J'écrirait une enveloppe autour des appels à la base de données dans l'application.
Exemple dans le code pseudo

CallDataBase (action, options,...) { 
    // Code for connectiong to DataBase 
} 

Alors vous venez de maquette de cette fonction que vous souhaitez d'autres fonctions

CallDataBase (action, options,...) { 
    return true; 
} 

De cette façon, vous pouvez se moquer de la base de données sans se soucier que ce soit un webservice ou une connexion à une base de données ou autre. Et vous pouvez l'obtenir vrai ou quoi que ce soit.

Testez votre système gère la réponse de la base de données

Pour prendre cette idée un peu plus loin et de faire vos tests encore plus puissant, vous pouvez utiliser une sorte de paramètres de test ou des paramètres de l'environnement pour contrôler ce qui se passe dans la moquée méthode de base de données. Ensuite, vous pouvez tester avec succès comment vos codes diffèrent les réponses de la base de données.
Encore une fois dans le pseudo-code (en supposant que votre base de données retourne réponse xml):

CallDataBase (action, options,...) { 
    if TEST_DATABASE_PARAMETER == CORRUPT_XML 
     return "<xml><</xmy>"; 
    else if TEST_DATABASE_PARAMETER == TIME_OUT 
     return wait(5000); 
    else if TEST_DATABASE_PARAMETER == EMPTY_XML 
     return ""; 
    else if TEST_DATABASE_PARAMETER == REALLY_LONG_XML_RESPONSE 
     return generate_xml_response(1000000); 
} 

et les tests de match:

should_raise_error_on_empty_xml_response_from_database() { 
    TEST_DATABASE_PARAMETER = EMPTY_XML; 
    CallDataBase(action, option, ...); 
    assert_error_was_raised(EMPTY_DB_RESPONSE); 
    assert_written_in_log(EMPTY_DB_RESPONSE_LOG_MESSAGE); 
} 
... 

Et ainsi de suite, vous obtenez le point. S'il vous plaît noter que tous mes exemples sont des cas de test négatifs, mais cela pourrait bien sûr être utilisé pour tester les cas de test positif aussi.

Bonne chance

Questions connexes