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 et Assembly.GetEntryAssembly().Location


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 931
    Par défaut Test unitaire et Assembly.GetEntryAssembly().Location
    Bonjour,

    Je viens de créer mon premier projet de tests unitaires en C# (j'utilise le projet standard installé avec Visual Studio 2013)

    Dans ce projet je teste l'appel à une méthode qui contient la ligne suivante :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    String directory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

    Cette ligne me renvoie me génère une NullReferenceException.
    Lorsque j'appelle cette même méthode à partir d'un programme en WinForm, elle s'exécute sans problème.

    Savez-vous d'où vient le problème ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    Dans le cas de tests unitaires exécutés dans VS, Assembly.GetEntryAssembly() retourne null.

    Il te faut utiliser un Mock

    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
     
    public interface IAssemblyLoader {
      Assembly GetEntryAssemblyLocation();
    }
     
    public class AssemblyLoader : IAssemblyLoader {
      public string GetEntryAssemblyLocation() {
        return Assembly.GetEntryAssembly().Location;
      }
    }
     
    public class MockAssemblyLoader : IAssemblyLoader {
      public string GetEntryAssemblyLocation() {
        // Retourne un chemin en dur pour tes tests
      }
    }

  3. #3
    Membre chevronné Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut
    La méthode GetEntryAssembly peut retourner null lorsqu'un assembly managé a été chargé à partir d'une application non managée. Par exemple, si une application non managée crée une instance d'un composant COM écrit en C#, un appel à la méthode GetEntryAssembly à partir du composant C# retourne une valeur null, car le point d'entrée pour le processus était du code non managé plutôt qu'un assembly managé.

    Visual studio (non managé) exécute nunint.exe non managé donc la fonction retourne null.

    ce phénomène se reproduit si on fait tourner nunit en mode gui.

    pas de vraie solution si ce n'est d'employer ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var s = Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().Location).LocalPath)

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 931
    Par défaut
    Citation Envoyé par euyeusu Voir le message
    Dans le cas de tests unitaires exécutés dans VS, Assembly.GetEntryAssembly() retourne null.

    Il te faut utiliser un Mock

    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
     
    public interface IAssemblyLoader {
      Assembly GetEntryAssemblyLocation();
    }
     
    public class AssemblyLoader : IAssemblyLoader {
      public string GetEntryAssemblyLocation() {
        return Assembly.GetEntryAssembly().Location;
      }
    }
     
    public class MockAssemblyLoader : IAssemblyLoader {
      public string GetEntryAssemblyLocation() {
        // Retourne un chemin en dur pour tes tests
      }
    }
    Simple et élégant, j'adhère mais cela ne signifie-t-il pas que le résultat de mon tests pourrait échouer si l'environnement dans lequel je l'exécute change ?

    Citation Envoyé par pascalCH
    La méthode GetEntryAssembly peut retourner null lorsqu'un assembly managé a été chargé à partir d'une application non managée. Par exemple, si une application non managée crée une instance d'un composant COM écrit en C#, un appel à la méthode GetEntryAssembly à partir du composant C# retourne une valeur null, car le point d'entrée pour le processus était du code non managé plutôt qu'un assembly managé.

    Visual studio (non managé) exécute nunint.exe non managé donc la fonction retourne null.

    ce phénomène se reproduit si on fait tourner nunit en mode gui.

    pas de vraie solution si ce n'est d'employer ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().Location).LocalPath)
    Cette solution fonctionne. Je marque comme résolu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/07/2011, 21h40
  2. Tests Unitaires - Production de documents
    Par giviz dans le forum Test
    Réponses: 13
    Dernier message: 07/02/2005, 08h41
  3. Tests unitaires en C#
    Par Bouboubou dans le forum Test
    Réponses: 2
    Dernier message: 01/10/2004, 13h03
  4. [TESTS] Tests unitaires
    Par mathieu dans le forum Test
    Réponses: 4
    Dernier message: 08/01/2004, 12h59

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