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 :

[Test unitaire] Méthode privée, générique et statique


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chargé de projets informatiques
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de projets informatiques
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut [Test unitaire] Méthode privée, générique et statique
    [Précision : Je travaille sous Visual Studio 2013]

    Bonjour tout le monde,

    Dans une de mes classes statiques, j'ai une méthode privée, générique et statique avec la signature suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static void MaMehode<T>(List<T> p1, ObservableCollection<T> p2)
    Je souhaite faire un test unitaire sur celle-ci. Pour cela j'utilise ce que j'ai toujours utilisé pour tester mes méthodes privées et statiques : la classe PrivateType et sa méthode InvokeStatic().
    Voici donc un extrait du code de mon test unitaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List<char> p1 = new List<char>() { 'd', 'a', 'c', 'b' };
    ObservableCollection<char> p2 = new ObservableCollection<char>() { 'a', 'b', 'c', 'd' };
     
    // [...]
     
    PrivateType pt = new PrivateType(typeof(MaClasse));
    pt.InvokeStatic(
        "MaMethode",
        new Type[] { typeof(List<char>), typeof(ObservableCollection<char>) },
        new object[] { p1, p2},
        new Type[] { typeof(char) }
     );
     
    // [...]
    Le problème, c'est qu'au débogage la méthode InvokeStatic() me génère une exception 'System.ArgumentException'. J'ai tenté autre chose avec la méthode InvokeStatic() (voir ci-dessous), mais rien n'y fait, j'ai toujours une exception.

    Est-ce que l'un d'entre vous aurait une solution, s'il vous plait ?
    Je pense que le soucis vient de mes paramètres dans la méthode InvokeStatic(), et plus particulièrement à cause du type générique utilisé dans la méthode appelée.

    Mon autre tentative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pt.InvokeStatic(
        "MaMethode",
        new Type[] { typeof(List<>), typeof(ObservableCollection<>) },
        new object[] { p1, p2},
        new Type[] { typeof(char) }
     );

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Pour faire ce genre de choses avec des méthodes privées statiques et génériques, il faut utiliser de la "reflection", et la méthode MethodInfo.MakeGenericMethod

    Voici un exemple de classes :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // La classe qui contient la méthode générique
    public class TaClasse
    {
        private static void MaMehode<T>(List<T> p1, ObservableCollection<T> p2)
        {
            // Le code de la méthode...
        }
    }
     
    // La classe à passer en tant que paramètre de type
    public class TypeParam { }
    Ce qui suit est le code qui permet d'invoker la méthode :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // On récupère via reflection la méthode à invoker
    var maMethode = typeof(TaClasse).GetMethod("MaMehode", BindingFlags.NonPublic | BindingFlags.Static);
     
    // On récupère le type à passer en paramètre de type de la méthode
    var typ = typeof(TypeParam);
     
    // On crée par reflection une méthode générique et on passe le type à utiliser
    var genericMethod = maMethode.MakeGenericMethod(new[] { typ });
     
    // On invoke la méthode, avec les paramètres...
    genericMethod.Invoke(null, new object[] { new List<TypeParam>(), new ObservableCollection<TypeParam>() });
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chargé de projets informatiques
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de projets informatiques
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut
    C'est super ! Merci beaucoup, ça marche !

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

Discussions similaires

  1. Tests unitaires sur méthodes imbriquées
    Par Maskass41 dans le forum C#
    Réponses: 0
    Dernier message: 11/03/2012, 15h26
  2. Tests unitaires : lien méthode à tester et méthode testée
    Par snopims dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 30/05/2011, 19h48
  3. Réponses: 0
    Dernier message: 09/05/2011, 11h38
  4. Réponses: 3
    Dernier message: 22/03/2011, 07h41
  5. Réponses: 2
    Dernier message: 04/05/2010, 15h35

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