1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    juillet 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juillet 2013
    Messages : 44
    Points : 89
    Points
    89

    Par défaut Tests unitaires avec le HandleError

    Bonsoir,

    J'ai dût, récemment, mettre en place un système de logging pour des softs .net.
    J'ai découvert dans la foulée la class HandleErrorAttribute que je me suis empressé d'étendre grosso modo ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        public class MonHandleErrorAttribute : HandleErrorAttribute
        {
            public override void OnException(ExceptionContext filterContext)
            {
                ... // récupération de la stack et mise en forme
                monlog(message);
            }
        }

    Jusqu'à là, pas de grande difficulté, je décore mes controlleurs ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    namespace blabla.Controllers
    {
        [MonHandleErrorAttribute]
        public class ExempleController
        {
            public ActionResult Index()
            {
                int? a = null;
                int b = (int)a;
                return View();
            }
        }
    }
    Et ça passe bien dans la méthode OnException quand on tombe sur une erreur non prévu.

    J'aurais souhaité poussé un peu plus la chose en me créant des tests fonctionnels d'exemples.
    Seulement voilà, ceci ne fonctionne pas du tout avec ce code :

    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
     
    namespace blabla.TestsUnitaires
    {
        [TestClass]
        public class UnitTestLog
        {
            [TestMethod]
            public void TestLogController()
            {
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = @"App.config";
                Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
                    fileMap, ConfigurationUserLevel.None
                );
                var sectionGroup = config.GetSection("system.web/customErrors") as CustomErrorsSection;
                ExempleController c = new ExempleController();
                c.Index();
            }
        }
    }
    Si je me met en mode débug avec un point d'arrêt dans la méthode "OnException", ça ne rentre jamais dedans...
    Des idées du pourquoi ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 384
    Points : 594
    Points
    594

    Par défaut

    C'est un attribut qui fait partie de la liste des outils d'ASP MVC ; de ce que j'ai pu voir il est utilisé spécifiquement par le module MvcHttpHandler pour gérer les exceptions levées par une méthode action d'un contrôleur (il fait partie des FilterAttribute). Ce n'est pas directement l'action du contrôleur ni le CLR qui l'utilisent, c'est la méthode appelante du MvcHttpHandler qui va vérifier la présence de cet attribut sur l'action et invoquer lui-même sa méthode OnException(). Pour tester tu pourrais simuler ce comportement avec un try-catch, en utilisant la réflexion :

    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
    namespace blabla.TestsUnitaires
    {
        [TestClass]
        public class UnitTestLog
        {
            [TestMethod]
            public void TestLogController()
            {
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                fileMap.ExeConfigFilename = @"App.config";
                Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
                    fileMap, ConfigurationUserLevel.None
                );
                var sectionGroup = config.GetSection("system.web/customErrors") as CustomErrorsSection;
                ExempleController c = new ExempleController();
     
                try
                {
                    var view = c.Index();
                }
                catch (Exception e)
                {
                    var ec = new ExceptionContext(){ Exception = e };
                    c.GetType()
                      .GetCustomAttributes(true)
                      .Where(a => a.GetType().IsAssignableTo(typeof(HandleErrorAttribute)))
                      .Select(a => (HandleErrorAttribute)a)
                      .ToList()
                      .ForEach(a => a.OnException(ec));
                }
            }
        }
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    juillet 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juillet 2013
    Messages : 44
    Points : 89
    Points
    89

    Par défaut

    Ok, je pensais que c'était un soucis de paramètrage.

    Merci pour l'exemple avec la réflexion : c'est au poil !

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur .Net
    Inscrit en
    décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2014
    Messages : 43
    Points : 92
    Points
    92

    Par défaut Test d'intégration???

    Bon le problème semble résolue, mais à mon gout ce n'est pas un test unitaire qu'il faut effectuer mais un test d'intégration non?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 384
    Points : 594
    Points
    594

    Par défaut

    Citation Envoyé par mothsART Voir le message
    Ok, je pensais que c'était un soucis de paramètrage.

    Merci pour l'exemple avec la réflexion : c'est au poil !
    J'ai proposé l'exemple avec la réflexion (qui permet tout de même de vérifier que l'attribut est bien présent sur la classe) afin d'illustrer la façon dont on peut utiliser un attribut dans le code ; une classe dérivée de la classe Attribute reste une classe normale en dehors de son usage spécial et peut être testée de façon classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [TestMethod]
    public void TestMonHandleErrorAttribute()
    {
      var attribute = new MonHandleErrorAttribute();
      try
      {
        attribute.OnException(new Exception("Test"));
      }
      catch(Exception e)
      {
        Assert.Fail(e);
      }
    }

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

Discussions similaires

  1. Test unitaire avec DUnit
    Par stef_chand dans le forum Outils
    Réponses: 1
    Dernier message: 07/09/2007, 16h40
  2. Test unitaire avec C# et nunit
    Par jeromechezgdf dans le forum C#
    Réponses: 6
    Dernier message: 16/07/2007, 12h51
  3. Tests unitaires avec vbUnit sur des contrôles utilisateurs
    Par Patrick Mortas dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/09/2006, 19h06
  4. test unitaire avec python
    Par Abla23 dans le forum Zope
    Réponses: 4
    Dernier message: 30/06/2006, 14h04

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