2010-02-21 5 views
3

Je suis un peu confusEst-ce qu'un framework Mock peut le faire pour moi?

du wiki: « Cela signifie qu'un vrai faux ... effectuer des tests sur les données transmises dans la méthode appelle comme arguments. »

Je n'ai jamais utilisé de tests unitaires ou de framework fictif. Je pensais que les tests unitaires sont pour des tests automatisés, alors à quoi servent les tests simulés? Ce que je veux, c'est un objet remplaçant ma base de données que je pourrais utiliser plus tard, mais je ne sais toujours pas quelle base de données ou quel outil orm j'utilise.

Quand je fais mon programme avec des mocks, est-ce que je pourrais facilement les remplacer par des POCO plus tard pour que le framework d'entité fonctionne par exemple rapidement?

edit: Je ne veux pas utiliser les tests unitaires mais utiliser Mocks comme un remplacement complet pour les entités + base de données serait bien.

+0

> "Je n'ai jamais utilisé de tests unitaires ou de cadres fictifs" => Commencez simplement par un test unitaire pour avoir une idée de ce sujet. plus tard, essayez de vous moquer. bonne vidéo sur youtube (C#): http://www.youtube.com/watch?v=f60aIlNhMoE ou pour java regardez ici http://java.dzone.com/articles/test-driven-teaching; vous pouvez trouver une intro très rapide avec du code ici: http://mockito.org/ – Karussell

Répondre

6

Oui, je pense que vous êtes un peu confus.

Les frameworks Mock servent à créer des objets "Mock" qui faussent une partie de la fonctionnalité de vos objets réels afin que vous puissiez les transmettre aux méthodes pendant les tests, sans avoir à créer l'objet réel à tester.

permet d'exécuter à travers un exemple rapide

Supposons que vous avez une méthode « Save() » qui prend un objet « Doc » et renvoie un indicateur de succès « booléen »

public bool Save(Doc docToSave(){...} 

Maintenant, si vous Si vous voulez écrire un test unitaire pour cette méthode, vous devez d'abord créer un objet document et le remplir avec les données appropriées avant de pouvoir tester la méthode 'Save()'. Cela nécessite plus de travail que vous voulez vraiment faire. Au lieu de cela, il est possible d'utiliser un cadre Mocking pour créer un faux objet 'Doc' pour vous.

Syntaxe différents entre les cadres, mais en pseudo-code que vous écrivez quelque chose comme ceci:

CreateMock of type Doc 
SetReturnValue for method Doc.data = "some test data" 

Le cadre moqueur va créer un objet fantaisie factice de type Doc qui renvoie correctement « des données de test » quand il est La propriété '.data' est appelée.

Vous pouvez ensuite utiliser cet objet factice pour tester votre méthode de sauvegarde:

public void MyTest() 
{ 
    ... 
    bool isSuccess = someClass.Save(dummyDoc); 
    ... 
} 

Le cadre moqueur assure que lorsque votre méthode « Save() » permet d'accéder aux propriétés de l'objet dummyDoc, les données correctes est retournée et l'économie peut se produire naturellement. Ceci est un exemple légèrement artificiel, et dans un cas aussi simple, il serait probablement aussi simple de créer un objet Doc réel, mais souvent dans un logiciel binaire complexe, il pourrait être beaucoup plus difficile de créer l'objet parce qu'il a dépendances sur d'autres choses, ou il a des exigences pour que d'autres choses soient créées en premier. Mocking supprime une partie de cette surcharge supplémentaire et vous permet de tester uniquement la méthode spécifique que vous essayez de tester et de ne pas vous soucier des complexités de la classe Doc.

Les tests blancs sont simplement des tests unitaires utilisant des objets simulés par opposition à des objets réels. Les objets mockés ne sont pas vraiment utilisés dans le cadre du code de production réel.Si vous voulez quelque chose qui prendra la place de vos classes de base de données pour que vous puissiez changer d'avis plus tard, vous devez écrire des interfaces ou des classes abstraites pour fournir les méthodes dont vous avez besoin pour correspondre à votre sémantique de sauvegarde/chargement. remplir plusieurs implémentations complètes en fonction des types de stockage que vous choisissez.

+0

"Si vous voulez quelque chose qui prendra la place de vos classes de base de données afin que vous puissiez changer d'avis plus tard, vous devez écrire des interfaces ou des résumés classes pour fournir les méthodes dont vous avez besoin pour correspondre à votre sémantique de sauvegarde/chargement, alors vous pouvez remplir plusieurs implémentations complètes en fonction des types de stockage que vous choisissez. " Oui interfaces ... mais j'ai besoin de les implémenter quelque part, donc je dois écrire mes propres POCO's comme le remplacement de la base de données et ces classes personnalisées devraient-ils imiter un laisse dire entité entité-cadre classe? – msfanboy

+0

Vous devez avoir des objets de données. Personnellement, je construirais vos objets de données d'entreprise en fonction de votre modèle d'entreprise et oublierais leur stockage. Vous pouvez ensuite écrire votre couche de stockage pour gérer vos objets métier (même si cela signifie que vous les mappez en interne sur certaines classes d'entités EF générées). L'EF in .net 3.5 ne supporte pas les POCO, mais la prochaine version .net 4.0 fera l'affaire. –

2

I pense ce que vous cherchez est le Repository Pattern. Ce lien est pour NHibernate, mais le modèle général devrait également fonctionner pour Entity Framework. En cherchant cela, j'ai trouvé Implementing Repository Pattern With Entity Framework.

Cela permet d'abstraire les détails de l'O/RM réel derrière une interface (ou un ensemble d'interfaces).

(je ne suis pas expert sur les dépôts, donc s'il vous plaît poster de meilleures explications/liens si quelqu'un les a.)

Vous pouvez ensuite utiliser un moqueur (isolement) cadre ou un code à la main fakes/talons au cours du développement initial avant de décider d'un O/RM.

Unit testing est où vous réaliserez tous les avantages. Vous pouvez ensuite tester les classes qui dépendent des interfaces de référentiel en fournissant des référentiels simulacres ou stub. Vous n'aurez pas besoin de configurer une base de données pour ces tests, et ils seront exécutés très rapidement. Les tests paient pour eux-mêmes encore et encore, et la qualité de votre code va augmenter.

+0

@TrueWill J'ai encore vérifié le lien de votre http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx et je ne l'aime pas parce qu'il hérite de EntityObject donc je suis en développement pour une mise en œuvre non une interface; je ne suis pas sûr de savoir quel ORM je vais utiliser bien que j'aie appris EF depuis 12 mois je ne l'aime pas pour les db trop locales bizarreries ... – msfanboy

+0

@ msfanboy - Ce n'est peut-être pas un bon exemple; c'est juste un que j'ai trouvé pour ce cadre. Je recommanderais certainement la programmation aux interfaces plutôt qu'aux implémentations; C'est dans l'esprit du Repository Pattern. Vous trouverez beaucoup d'informations sur les avantages et les inconvénients de divers ORM sur SO. :) – TrueWill

Questions connexes