IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Tests Unitaires, simuler le résultat d'une méthode


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 31
    Points : 25
    Points
    25
    Par défaut Tests Unitaires, simuler le résultat d'une méthode
    Bonjour à tous,

    Je suis entrain de créer des tests unitaires sur un projet déjà démarré depuis un certain temps.

    Je cherche à tester le retour d'une méthode au moyen de Assert.
    Le problème c'est que cette méthode fait appel à un contexte de calcul que je ne peux charger pour le test.

    Je souhaiterai savoir s'il est possible de spécifier le retour de cette méthode appelée et de faire mon test en fonction de cette valeur de retour.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public string MéthodeATester()
    {
      (...) code
      int valeur = ContexteDeCalcul.GetValeur(); // <- c'est cette méthode que je souhaite émuler dans mon test
      (...) code
     
      return valeurRetour;
    }

    Test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void MéthodeATesterTest()
    {
      MaClasse c = new MaClasse();
      string expected = "blabla";
      string actual = c.MéthodeATester(); // <- c'est ici que je souhaite spécifier l'émulation de la méthode citée plus haut
      Assert.AreEquals(expected, actual); // Test
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ca va demander quelques changements dans ton architecture... En gros, il faudrait que tu utilises l'injection de dépendance. Tu définis une interface IContexteDeCalcul, et tu manipules l'interface plutôt qu'une implémentation explicite. Plutôt que de créer explicitement une instance du contexte de calcul, tu utilises un container IoC comme Unity, StructureMap ou autre pour fournir l'implémentation à la demande

    En gros, plutôt que de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ContexteDeCalcul contexte = new ContexteDeCalcul();
    Tu vas faire un truc comme ça (variable selon le container IoC utilisé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IContexteDeCalcul contexte = container.Resolve<IContexteDeCalcul>();
    Ensuite, il faut juste que tu fasses une implémentation "bidon" de IContexteDeCalcul, utilisée pour les tests

    Au démarrage de la "vraie" appli, tu vas faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    container.Register<IContexteDeCalcul>(new ContexteDeCalcul());
    Alors que dans le setup du test, tu vas faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    container.Register<IContexteDeCalcul>(new ContexteDeCalculPourLesTests());
    Je ne suis pas un expert de l'injection de dépendance, donc je te renvoie à cet article...
    http://philippe.developpez.com/artic...dedependances/

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Tu as plusieurs façons de faire, des fakes, stubs, mocks...

    Ils ont tous un point commun, c'est la nécessité de faire de l'injection de dépendance (comme l'a conseillé Tomlev). Tu peux utiliser un framework de mock qui permet de simuler simplement le retour d'une méthode (Rhino Mock, Moq...).

    Il y a un tutorial Rhino Mock http://philippe.developpez.com/artic...roductionMock/ (encore Philippe ^^).

    Si tu utilises une version plus récentes du framework .NET, Moq est meilleure de mon point de vue .
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    +1 pour Moq. Evidemment, il faut que les proprietes/methodes soient virtual pour que moq puisse les simuler. Sinon il faut passer a Isolator, qui lui peut tout faire (même des classes abstract) mais c'est tout de suite un peu plus cher (style 700 euros)
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

Discussions similaires

  1. utiliser le résultat d'une méthode
    Par ebenmous dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/06/2011, 14h53
  2. Réponses: 2
    Dernier message: 04/05/2010, 15h35
  3. Résultat d'une méthode. Affectation ou modification ?
    Par kernelfailure dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/06/2009, 22h19
  4. Test unitaire sur les vue d'une base de données
    Par bragon dans le forum Tests et Performance
    Réponses: 4
    Dernier message: 04/02/2009, 12h29
  5. récupérer résultat d'une méthode
    Par kakuzu dans le forum Général Python
    Réponses: 3
    Dernier message: 07/04/2008, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo