2010-12-15 7 views
3

Je viens de terminer un tutoriel pour le développement piloté par les tests en C# avec Nunit. Je veux maintenant utiliser des tests unitaires pour mon nouveau projet, mais j'ai des difficultés à écrire des tests. Comment écrire au mieux des tests unitaires pour des classes impliquant un accès à la base de données ou au service web? Quelqu'un peut-il me donner des exemples de cours/tests unitaires?Comment tester des classes impliquant Database et Exchange Server Access?

Répondre

5
  • Conception d'une interface enveloppant la fonctionnalité d'appeler db, l'envoi d'e-mail, ...
  • écrire une implémentation de votre classe et charger la cette classe dans la classe dépendante en utilisant DI
  • Utilisez un cadre de simulation pour créez un objet Mock et définissez les attentes dans votre test unitaire.

Voici un pseudo-code exemple (générateur Mock utilisé ici est Moq cadre):

interface IEmailer 
{ 
    void Send(Email email); 
} 

class RealEmailer : IEmailer 
{ 
    public void Send(Email email) 
    { 
     // send 
    } 
} 

class UsesEmailer 
{ 
    private IEmailer _emailer; 

    public UsesEmailer(IEmailer emailer) 
    { 
     _emailer = emailer; 
    } 


    public foo(Email email) 
    { 
     // does other stuff 
     // ... 
     // now sends email 
     _emailer.Send(email); 
    } 

} 

class MyUnitTest 
{ 
    [Test] 
    public Test_foo() 
    { 
     Mock<IEmailer> mock = new Mock<IEmailer>(); 
     Email m = new Email(); 
     mock.Expect(e => e.Send(It.Is<Email>(m))); 
     UsesEmailer u = new UsesEmailer(mock.Object); 
     u.Send(m); 
     mock.Verify(); 
    } 

} 

MISE À JOUR

Maintenant, si vous testez RealEmailer, il sont quelques façons, mais fondamentalement, vous devrez configurer le test pour vous envoyer en email et vous vérifiez dans le. Ce n'est pas tout à fait un test unitaire puisque vous testez non seulement votre code mais la configuration, le réseau, le serveur d'échange, ... en fait si vous faites RealEmailer petit ayant peu de code, vous pouvez sauter le test d'unité d'écriture.

+0

Merci pour votre réponse. Mais que signifie DI? – Luke

+0

C'est injection de dépendance. Vous pouvez utiliser NInject, Windsor Castle, StructureMap, Spring.NET ou Unity. J'utilise Windsor. – Aliostad

+0

J'ai une autre question: Puis-je utiliser moq avec Nunit? – Luke

Questions connexes