2016-05-16 1 views
1

J'ai besoin de conseils de test.La base de données de test existe. TDD

Je sais que c'est généralement une mauvaise pratique de frapper une base de données dans les tests unitaires sauf dans des circonstances exceptionnelles.

Je suis en train d'adopter une approche TDD pour un projet MVC utilisant EF. Mon premier test est:

void DatabaseShouldExist() { ... } 

Je voudrais savoir ... Est-ce une circonstance exceptionnelle?

Je veux vérifier que EF a généré le DB et mon prochain test sera de vérifier s'il contient les données de départ correctes.

Comment allez-vous tester cela?

Devrait-il être testé?

+0

Cadre de moquerie. NSubstitute. – Karolis

+1

Je ne suis pas d'accord. Si vous testez un DAO, cela n'a aucun sens de faire autre chose que de cliquer sur la base de données. Une fois cela fait, les classes qui ont une dépendance sur le DAO peuvent compter sur des simulacres. Je ne voudrais pas écrire un test pour voir si la base de données existe. Je suppose que c'est a priori. – duffymo

+0

Ce n'est pas une mauvaise pratique du tout * de faire un test d'intégration *. La seule chose est, ce n'est pas la même chose que les tests «unitaires», mais c'est très utile. De plus, je suis entièrement d'accord avec @duffymo. Si la base de données n'est pas créée, vous le remarquerez, ne vous inquiétez pas. –

Répondre

1

Vous souhaitez tester le comportement, donc pas si une base de données existe ou non. Comme suggéré dans les commentaires, commencez par la logique métier. TDD commence petit et est itérative, ne pas plonger dans DB test logique 1.

exemple Simplistic (Pour une application pour stocker des films)

Test 1 - shouldAddAMoveToList() 
Test 2 - shouldBeAbleToRetrieveAMovieFromList() 
Test 3 - shouldPersistAMovieBeweenSessions() // Could Be DB here 

Lorsque vous utilisez TDD, ramasser quelque chose de simple premier. La partie DB devrait entrer en jeu un peu plus tard.

Personnellement, j'éviterais les tests sur une base de données avec un test unitaire et je l'enregistrerais pour les tests d'intégration. Le pattern DAO est bon car vous pouvez persister en mémoire, ou simplement simuler le côté DB dans Unit Tests.

tests unitaires devraient essayer d'adhérer à la FIRST principle, l'introduction de bases de données peuvent ralentir les tests et les empêcher d'être indépendant (sauf compensation DB à chaque fois) - A tout le moins essayer d'utiliser la base de données en mémoire pour tests unitaires

+0

Désolé, quel est le modèle DAO? –

+0

Objet d'accès aux données - Voir ce lien. http://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm – MikeJ

+1

merci Mike. J'utilise Entity Framework pour l'accès aux données. Il utilise POCO donc en ce sens, les dépôts moqueurs semble raisonnable. –