7
votes

Contexte de test Mstest Manipulation d'exception

Y a-t-il une manière que je puisse arriver à l'exception qui a été traitée par le cadre Mstest à l'aide du testContext ou d'une autre méthode sur une classe de test de base?

Si une exception non gérée survient dans l'un de mes tests, je ' D aime tourner à travers tous les éléments de l'exception.Data dictionnaire et les afficher au résultat du test pour m'aider à comprendre pourquoi le test a échoué (nous ajoutons habituellement des données à l'exception pour nous aider à déboguer dans la production env. d aime faire la même chose pour tester). p>

Remarque: je ne teste pas qu'une exception était censée se produire (j'ai d'autres tests pour cela), je teste un cas valable, j'ai juste besoin de Voir les données d'exception. P>

Voici un exemple de code de ce dont je parle. p> xxx pré>

Je comprends qu'il y a des problèmes autour de pourquoi je ne devrais probablement pas T avoir une telle méthode d'encapsulation, mais nous avons également des sous-tests pour tester toutes les fonctionnalités de performsomecalculation ... P>

Cependant, si le test échoue, 99% du temps, je remédier à ce que cela passe, donc Je ne peux plus déboguer g sans ces informations. Je voudrais également faire cela au niveau mondial, de sorte que, si un test échoue, je reçois les informations dans les résultats des tests, par opposition à la faire pour chaque test individuel. P>

Voici le code que mettrait les informations d'exception dans les résultats du test. P>

    public void AddDataFromExceptionToResults(Exception ex)
    {
        StringBuilder whereAmI = new StringBuilder();
        var holdException = ex;
        while (holdException != null)
        {
            Console.WriteLine(whereAmI.ToString() + "--" + holdException.Message);
            foreach (var item in holdException.Data.Keys)
            {
                Console.WriteLine(whereAmI.ToString() + "--Data--" + item + ":" + holdException.Data[item]);
            }

            holdException = holdException.InnerException;
        }
    }


3 Réponses :


4
votes

J'ai rencontré le même problème, il ne semble pas y avoir de soutien pour cela. Vous ne pouvez même pas utiliser l'accrochage non gourmonné d'ApplicationDomain depuis si Mstest n'a pas attrapé des exceptions avant de se barboter aussi loin, elle s'écraserait elle-même.

Solution possible: P>

    private delegate void TestImplDelegate();

    private void RunTestWithExceptionLogging(TestImplDelegate testImpl)
    {
        try
        {
            testImpl();
        }
        catch (Exception e)
        {
            string message = e.Message; // don't warn about unused variables

            // do logging here
        }
    }

    [TestMethod]
    public void test1()
    {
        RunTestWithExceptionLogging(test1Impl);
    }
    private void test1Impl()
    {
        // test code goes here

        throw new Exception("This should get logged by the test wrapper.");
    }

    [TestMethod]
    public void test2()
    {
        RunTestWithExceptionLogging(test2Impl);
    }
    private void test2Impl()
    {
        // test code goes here

        throw new Exception("This should get logged by the test wrapper.");
    }


0 commentaires

2
votes

Voici un travail "propre" autour qui mettra l'exception à une propriété TestBase.TestContext (ou où que vous souhaitiez dans votre instance TestBase).

L'exemple utilise posthars (qui est un AOP lib) pour injecter des captures d'essai à votre code dans la compilation. Il sera injecté à toutes les méthodes qui ont un attribut [TestMethod]. - L'édition FREE POSTSHARP fera le travail, pas besoin d'une licence. P>

1ère chose que vous devez faire est de créer l'attribut AOP. Les attributs définissent ce qui sera fait en cas d'exception et + définir des conditions d'injection, c'est ainsi que vous le faites: P>

[assembly: CodedTestsExceptionsHandlingAop(AttributeTargetTypes = "*", AttributeTargetElements = MulticastTargets.Method)]


0 commentaires

0
votes

Si vous voulez simplement tester des exceptions attendues, vous pouvez utiliser le attenduExceptionAttribute

Je penserais pouvoir obtenir l'exception d'un test unitaire serait plus utile lorsqu'il s'agit d'une exception inattendue et que vous souhaitez enregistrer ou collecter des informations supplémentaires sur l'exception, plutôt que de compter sur le testExplorer pour trouver un examen d'examen. Tests.


0 commentaires