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 :

Tester methode private


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut Tester methode private
    Bonjour.
    Je souhaiterais tester une methode privée. Au dela du débat pour ou contre le test de methode privée, est-ce que vous pourriez m'aider?

    J'ai actuellement le code ci dessous:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    public class Asset
        {
            /// <summary>
            /// Calculates the PnLs for the different scenarios given as historical data
            /// </summary>
            /// <returns>An array with the different PnLs for the scenarios</returns>
            public double[] ScenarioPnL()
            {
                double[] _scenarios = this.GenerateScenarios();
                double[] _scenarioPnL = new double[_scenarios.Length];
     
                for (int _i = 0; _i < _scenarioPnL.Length; _i++)
                {
                    _scenarioPnL[_i] =  this.CurrentValue;
                }
                return _scenarioPnL;
            }
     
            private double[] GenerateScenarios()
            {
                if (!this.CheckInput())
                {
                    return null;
                }
     
                //1 less scenario than there are historical values
                double[] _scenarios = new double[this.HistoricalValues.Length - 1];
     
                for (int _index = 0; _index < _scenarios.Length; _index++)
                {
                    _scenarios[_index] =
                            this.CurrentValue *
                            (this.HistoricalValues[_index + 1] / this.HistoricalValues[_index]);
                }
                return _scenarios;
            }
     
            // checks the validity of input
            private bool CheckInput()
            {
                if (this.Name == null)
                {
                    throw new ArgumentException("Name of the asset is null or invalid ");
                }
     
                if (Double.IsNaN(this.CurrentValue))
                {
                    throw new ArgumentException("Current value is invalid ");
                }
     
                foreach (double _historicalValue in this.HistoricalValues)
                {
                    if (Double.IsNaN(_historicalValue))
                    {
                        throw new ArgumentException(" The historical value: "
                                                    + _historicalValue + " is invalid in HistoricalValues");
                    }
                }
                return true;
            }
     
            //public Asset(string name, double currentValue,double w, double[] hist)
            //{
            //    Name = name;
            //    CurrentValue = currentValue;
            //    Weight = w;
            //    HistoricalValues = hist;
            //}
     
            /// <summary>
            /// Gets or sets Name of the asse
            /// </summary>
            public string Name { get; set; }
     
            /// <summary>
            /// Gets or sets Current value of the asset
            /// </summary>
            public double CurrentValue { get; set; }
     
            /// <summary>
            /// Gets or sets This is the weight of the asset in the portfolio
            /// </summary>
            public double Weight { get; set; }
     
            /// <summary>
            /// Gets or sets Historical value of the asset
            /// </summary>
            public double[] HistoricalValues { get; set; }
    .

    Je souhaite tester les methodes "CheckInput" et "GenerateScenarios". En generant les tests avec VS, un Accessor est créé "Asset_Accessor"... Mais je ne peux pas appeler les methodes privées sur lui...

    Une idée de ce que je fais de mal?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    Même si tu ne veux pas lancer le débat je me dois de préciser que sauf exception, si tu as un besoin de tester une méthode privée c'est que tu as un souci d'architecture comme précisé ici (parmi d'autres infos) :

    http://stackoverflow.com/questions/2...rivate-methods

    Visual studio peut via l'assistant te générer les méthodes comme précisé ici :
    http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx
    http://blog.developpez.com/nico-pyri...ethode-privee/

    Ou tu peux enfin t'en sortir par reflexion.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur E&D
    Inscrit en
    Février 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur E&D

    Informations forums :
    Inscription : Février 2010
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Une réponse qui peut sembler stupide, mais pour l'instant je ne vois pas ce qui t'empecherais de rendre les méthodes publiques, (méthodes utilisées dans d'autre projet peut etre ?), juste pour les tester !

    Sinon l'assistant de visual studio repondra très bien à ta demande
    Ou si tu veux le faire toi même, tu peut, comme le dit nah666, utiliser la réflexion. Ce qui revient à faire quelque chose de compliqué pour au final pas grand chose ...

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Justement l'assistant de Visual studio me créé un Accessor qui est sensé pouvoir me donner accès a la methode mais au final il ne marche pas... Du coup je sais pas d'où vient le problème... A préciser que je compile ma bibliothèque en 2.0 du coup peut-être que ces fonctionalités n'existaient pas...

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par nah666 Voir le message
    Même si tu ne veux pas lancer le débat je me dois de préciser que sauf exception, si tu as un besoin de tester une méthode privée c'est que tu as un souci d'architecture comme précisé ici (parmi d'autres infos) :
    Moi j'ai envie de lancer le débat, j'ai jamais fait beaucoup de UnitTest mais ca me semble bizzare.

    Donc si j'ai public isValide()
    que j'ai divisé en differente fonction isValideNom(), isValideEmail(),...

    Je devrais mettre celles-ci en public?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    Moi j'ai envie de lancer le débat, j'ai jamais fait beaucoup de UnitTest mais ca me semble bizzare.

    Donc si j'ai public isValide()
    que j'ai divisé en differente fonction isValideNom(), isValideEmail(),...

    Je devrais mettre celles-ci en public?
    Pourquoi voudrais-tu les mettre en public? Si isValide() est public tu peux la tester directement non?

    Le cas dont je parle est si je veux tester isValideNom(), isValideEmail() qui elles sont privées...

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Mais je trouve plus facile de faire des tests pour isValidNom() et isValidEmail()
    que de faire des Test sur isValid()

    Par exemple je dois tester que le nom ne peut-être vide
    Je fais un test avec un new Client(Nom:"Jean",Email:"a@a.fr") et avec Client(Nom:"",Email:"a@a.fr")
    Le lendemain on me demande de ne plus qu'accepter que les Email avec ".com"
    Mes tests sur le nom ne sont plus valide à cause de l'email
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Le principe d'un test unitaire c'est que ca doit tester une boite noire!
    C'est destiné avant tout à la non regression pour quelqu'un qui utiliserait cette boite noire et ca peu importe l'implémentation!

    Si tu as un client qui consomme IsValid(), il veut qu'avec les entrées E1 et E2 il ait toujours la sortie S1. Comment c'est fait à l'intérieur il s'en contrefiche... Si IsValidNom() part ceuillir des marguerites pendant que IsValidEmail() fait le boulot à la place et verifie le nom + le mail c'est pas grave, il faut juste que pour E1 et E2 il y ait S1!

    Un test unitaire n'est pas un test d'implémentation. C'est pour la vérification des contrats.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Bon je vais me renseigner sur la différence entre les test unitaires et les tests d'implémentations

    il me semble qu'on parle souvent des test d'implémentation plutot que des test unitaires mais bon je peux me tromper
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Le principe du test unitaire est de verifier qu'au plus petit niveau consommable du composant, le comportement ne change pas. Le découpage que tu réalises à l'interieur du composant pour organiser ton code de manière propre n'est pas du ressort.

    Imagine que tu veux tester unitairement un clavier: ce qui t'importe et pour la non regression c'est que pour un A tapé, tu aies un A affiché. Que le signal soit envoyé electriquement ou par pigeon voyageur, toi consommateur ca n'est pas ton problème

Discussions similaires

  1. Question sur l'accès aux method private
    Par Phantom_Lord21 dans le forum Caml
    Réponses: 1
    Dernier message: 02/07/2010, 20h24
  2. methode private C++
    Par infodevix dans le forum Débuter
    Réponses: 1
    Dernier message: 07/12/2009, 00h36
  3. [unit test] methode protected / private
    Par ZaaN dans le forum C#
    Réponses: 2
    Dernier message: 10/03/2008, 16h10
  4. [JUnit] Pour tester les methodes d'acces à une sgdb
    Par yanis97 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 15/04/2004, 15h55

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