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 :

[C#][Unit Tests][Delegate] Methode consideree comme un groupe de methodes


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut [C#][Unit Tests][Delegate] Methode consideree comme un groupe de methodes
    Bonsoir,

    Au niveau du contexte, je souhaite tester une classe imbriquee qui utilise un delegate pour des operations mathematiques (add, sub, mul...).
    La classe Nested est imbriquee et en protected car elle n'a pas d'utilite a l'exterieur de MyDelegate. Idem pour le delegate en protected, qui depend de la visibilite de la classe Nested.

    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
    public class MyDelegate
    {
    	protected class Nested
    	{
    		protected delegate float MyOpDelegate (Nested x, Nested y);
    
    		// Champs et Constructeurs...
    
    		public static float Add (Nested x, Nested y)
    		{
    			// des calculs...
    		}
    
    		protected float Calculate (MyOpDelegate op)
    		{
    			// code...
    		}
    	}
    }
    Au niveau du test unitaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float res = 0;
    MyDelegate_Accessor.Nested nested = new MyDelegate_Accessor.Nested (42f);
     
    res = nested.Calculate (MyDelegate_Accessor.Nested.Add);
    Assert.AreEqual (res, 51f);
    La compilation du code passe nickel, mais en revanche le code du test unitaire plante:
    erreur CS1502: La méthode surchargée correspondant le mieux à 'DelegateDummy.MyDelegate_Accessor.Nested.Calculate(DelegateDummy.MyDelegate_Accessor.Nested.MyOpDelegate)' possède des arguments non valides
    erreur CS1503: Argument '1'*: impossible de convertir de 'groupe de méthodes' en 'DelegateDummy.MyDelegate_Accessor.Nested.MyOpDelegate'
    Le compilateur parle de groupe de methodes, mais ici, Add n'est pas surchargee.
    Lorsque je passe tout en public (classe Nested et delegate), le compilateur est gentil et le code du test compile normalement (mais si possible, j'aimerais eviter de tout mettre en public, comme je l'ai enonce plus haut).
    Auriez-vous une explication a cela, et comment je peux resoudre mon probleme ?

    Autre question: Lorsque je veux creer un test unitaire pour la methode Calculate, Visual Studio ne me propose pas ce choix dans l'assistant... Pourquoi ?

    Merci

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Tu utilises quelle version de C# ? Avant la version 2.0, il fallait spécifier explicitement le delegate à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res = nested.Calculate (new MyDelegate_Accessor.Nested.MyOpDelegate(MyDelegate_Accessor.Nested.Add));

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Si c'est bien comme ca pour obtenir la version de C#, j'ai la version 2.0.50727.4927.

  4. #4
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Bizarre.... et avec le code que je t'ai donné, ça marche pas non plus ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Non c'est pas vraiment mieux, j'obtiens:
    erreur CS1503: Argument '1'*: impossible de convertir de 'groupe de méthodes' en 'Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject'

  6. #6
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Bizarre cette erreur

    C'est pas le fait que ta classe Nested et le delegate soient protected qui pose problème ? Parce qu'a priori le code des tests unitaires ne peut pas y accéder si c'est protégé...

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 267
    Points : 12 485
    Points
    12 485
    Par défaut
    Je crois bien que l'attribut "InternalsVisibleTo" (http://msdn.microsoft.com/fr-fr/library/bb385840.aspx) est une solution de contournement assez moyenne.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    ... ce qui expliquerait le pourquoi ca marche lorsque tout est en public...
    Parmi les solutions que j'ai pu voir en googlisant:
    * utiliser le preprocesseur pour changer l'attribut des methodes (#ifdef DEBUG public #else protected...) => BEURK
    * tout passer en public pour avoir le plaisir de voir les tests marcher => BEURK
    * utiliser la reflection dans les tests:
    Apres avoir pas mal galere, voila ou j'en suis rendu, et ca a l'air de marcher, meme si le code est tres tire par les cheveux...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // On recupere la classe imbrique protegee
    Type tNested = new MyDelegate ().GetType ().GetNestedType ("Nested", BindingFlags.NonPublic | BindingFlags.Instance);
     
    // On recupere la methode a passer en argument (Add) pour en faire un nouveau delegate de type MyOpDelegate
    MethodInfo miAdd = tNested.GetMethod ("Add");
    Type tDelegate = tNested.GetNestedType ("MyOpDelegate", BindingFlags.NonPublic | BindingFlags.Public);
    Delegate addDelegate = Delegate.CreateDelegate (tDelegate, miAdd);
     
    // Enfin, on appelle Calculate a partir d'une instance de Nested.
    Object nested = System.Activator.CreateInstance (tNested, new object[] {42f});
    MethodInfo miCalculate = tNested.GetMethod ("Calculate", BindingFlags.NonPublic | BindingFlags.Instance);
    res = (float) miCalculate.Invoke (nested, new object[] {addDelegate});
    En comparaison avec le code initial sans reflection, mais qui ne marche pas...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyDelegate_Accessor.Nested nested = new MyDelegate_Accessor.Nested (42f);
     
    res = nested.Calculate (MyDelegate_Accessor.Nested.Add);
    Si quelqu'un a une meilleure solution/solution moins alambiquee, je suis preneur...

    Merci tomlev pour ta participation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [unit test] methode protected / private
    Par ZaaN dans le forum C#
    Réponses: 2
    Dernier message: 10/03/2008, 17h10
  2. Meilleure solution pour des unit tests? (dans mon cas)
    Par nicdo77 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 19/08/2007, 20h32
  3. [Unit Testing] Comment s'y prendre avec Hibernate ?
    Par Wookai dans le forum Hibernate
    Réponses: 2
    Dernier message: 21/06/2007, 12h10
  4. Unit Test : CppUnit
    Par kanonji dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 01/02/2007, 17h03
  5. Réponses: 3
    Dernier message: 10/04/2004, 00h35

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