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 :

Tests unitaires avec le HandleError


Sujet :

C#

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

    Informations forums :
    Inscription : Juillet 2013
    Messages : 49
    Points : 110
    Points
    110
    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 chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    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
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 49
    Points : 110
    Points
    110
    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 habitué
    Homme Profil pro
    Ingénieur .Net
    Inscrit en
    Décembre 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 : 71
    Points : 147
    Points
    147
    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 chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    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, 15h40
  2. Test unitaire avec C# et nunit
    Par jeromechezgdf dans le forum C#
    Réponses: 6
    Dernier message: 16/07/2007, 11h51
  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, 18h06
  4. test unitaire avec python
    Par Abla23 dans le forum Zope
    Réponses: 4
    Dernier message: 30/06/2006, 13h04

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