É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.

Petite mise à jour

J'ai été plutôt silencieux ces dernières semaines. La raison est que je suis débordé dernièrement.

J'ai déménagé, ce qui a demandé beaucoup de mon temps. L'appartement commence enfin à avoir l'air d'un endroit habitable!

Quelque chose est arrivé qui m'a beaucoup fâché: 2 jours après avoir emménagé, je me suis fait voler >:(. Ils ont pris mon ordinateur portable, des DVD, bijoux... Au total pour près de 3000$. Donc en plus d'être très occupé à remettre de l'ordre dans nos affaires, nous avons du nous occuper de remplir un rapport de police et de faire une réclamation à nos assurances. Au moins, il y a maintenant toujours quelqu'un à l'appartement d'en dessous, donc ce genre de chose ne devrait plus se produire.

Je suis également beaucoup occupé par mon travail. Ces temps-ci, je passe mes journées à corriger des bugs ou à écrire des tests unitaires. Il ne s'agit pas du travail le plus passionnant qui soit, et donc quand je termine ma journée, j'essais de me changer les idées et j'évite mon ordinateur!

Malgré tout, je vais essayer d'écrire un peu plus fréquemment. Attendez-vous à un autre article d'ici quelques jours.