Écrire des tests unitaires pour une application ASP.NET

S'il y a une méthodologie de développement qui a gagné beaucoup de popularité ces dernières années, c'est l'écriture de tests unitaires.

De bons tests unitaires sont indispensables puisqu'ils offrent un filet de sureté dans le cadre de la maintenance d'applications. Si votre couverture de code est suffisante, et que vos tests sont correctement conçus, vous pourrez faire des modifications au code sans avoir peur de briser d'autres fonctionnalités par la même occasion.

Il existe de nombreux Framework de tests unitaires pour .NET, tel NUnit, xUnit ou MSTest. Chacun ont leurs forces et faiblesses, mais une lacune commune à travers ces différents outils est la difficulté de tester des applications ASP.NET.

Le principal problème pour ce genre de test est l'absence du HttpContext dans le cadre d'un test unitaire. Admettons que vous avez créé des classes pour écrire et lire des valeurs dans la session d'un usager, comment tester cela si HttpContext.Current est null lors des tests?

J'ai rencontré ce problème pour le projet sur lequel je travail présentement. Après quelques essais infructueux à créer moi même une instance de HttpContext, j'ai trouvé une solution simple et élégante. HttpSimulator, par Phil Haack, est une composante très bien faite qui permet de simuler l'état d'une application pendant une requête ASP.NET.

Son usage est extrêmement simple :

// Cet exemple utilise MSTest

[TestMethod]
public void SetAndRetreiveBasketID()
{
    string expected = "Sample value";
    string actual;

    using (new HttpSimulator().SimulateRequest())
    {
        SessionHelper.BasketID = expected;
        actual = SessionHelper.BasketID;
    }

    Assert.AreEqual(expected, actual);
}

Bref, tout le code situé à l'intérieur du using peut utiliser HttpContext.Current. Il est aussi possible de définir des paramètres afin de spécifier une URL particulière, ou encore pour simuler le POST d'un formulaire.

Malheureusement, certaines propriétés du HttpContext demeurent null même en utilisant HttpSimulator, et donc il se peut que vous ne puissiez pas tester toutes les fonctionnalités. Dans certains cas, il est possible de modifier légèrement HttpSimulator pour inclure ce dont vous avez besoin, mais dans d'autres cas, ça peut être plus compliqué.

Malgré tout, ce simulateur devrait vous aider à tester une bonne partie de votre code. Notez que cet outil n'est pas conçu pour tester vos pages ASPX. Il sert à tester le code qui a besoin d'un HttpContext pour fonctionner. Pour tester vos pages, il existe d'autres outils.