Une fonctionnalité intéressante que j’ai découvert lors du BizSpark présenté par Scott Guthrie, est le mode “consume-first” de IntelliSense qui permet très aisément de pratiquer le TDD. Pour rappel, le TDD peut être résumé par la phrase From Red To Green et impose les étapes suivantes :

  1. Red : crée un test et fais le échouer.
  2. Green : fais passer le test par tous les moyens en écrivant du code de production sans se trop soucier de la forme.
  3. Refactor : Modifie le code pour enlever les duplications de code dans le projet, améliorer le design en s’assurant que tous les tests passent toujours.

Si on suit la logique du TDD on doit d’abord écrire le test avant d’écrire le code de production. Pour faire simple, admettons que dans notre application ASP.NET MVC nous n’avons pas le “HomeController” (ni le test unitaire associé) et nous voulons le créer. Donc d’abord il faut créer le test unitaire de notre contrôleur avant de créer le contrôleur lui même. Je crée donc ma classe “HomeControllerTests” dans mon projet des tests :

1
2
3
4
5
6
7
8
[TestClass] 
public class HomeControllerTests
{
[TestMethod]
public void Index()
{
}
}

Rien de spécial. Maintenant il faut que j’écrive mon test pour le contrôleur qui n’existe pas encore et là j’ai un petit souci. Lorsque j’essaie d’écrire du code contre une classe qui n’existe pas encore, forcément IntelliSense de Visual Studio me propose le choix qu’il connaît, comme ici, c’est la classe de test elle-même:

TDDVS2010

Quand vous effectuez une tabulation ou cliquez sur l’espace il vous insérera la classe “HomeControllerTests” ce qui n’est pas le but. Il existe cependant un moyen de dire à IntelliSense que le code que nous allons écrire ne se réfère pas à une classe qui existe déjà mais que nous allons créer plus tard.

Il s’agit du mode “consume-first” que vous activez avec la combinaison des touches Ctrl+Alt+Espace. Notez la différence:

TDDVS2010_2

Visuellement il y a une ligne supplémentaire qui apparaît dans IntelliSense. Maintenant quand vous écrivez votre code, l'IntelliSense ne vous “force” pas à choisir parmi les sélections disponibles. Une fois les tests terminés:

1
2
3
4
5
6
7
8
9
10
11
12
13
[TestMethod] 
public void Index()
{
// Arrange
HomeController controller = new HomeController();

// Act
ViewResult result = controller.Index() as ViewResult;

// Assert
ViewDataDictionary viewData = result.ViewData;
Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]);
}

Mais ce n’est pas fini ! Vous pouvez facilement générer votre contrôleur à partir de votre code de test :) Pour cela placez vous sur la ligne du “HomeController” et faites Ctrl+. (point). Vous verrez un petit menu qui s’affiche:

TDDVS2010_3

Je choisi “Generate new type…” pour pouvoir ajouter ma nouvelle classe dans mon application ASP.NET MVC et non au même endroit que ma classe de tests (comportement par défaut si vous cliquez sur la première option).

TDDVS2010_4

Notez que vous pouvez choisir l’endroit où vous voulez que votre classe soit créée. Maintenant je peux aller compléter ma classe juste pour que la solution compile. Quand je lance mon test unitaire je vois bien que la méthode ne marche pas bien:

TDDVS2010_6

Je retourne donc dans ma classe et y ajoute le code qui est censé tester mon test unitaire. Si tout va comme prévu j’obtiens le résultat suivant:

TDDVS2010_5

Conclusion

Comme vous pouvez le constater ceci n’est pas une grande révolution mais cependant je trouve que ça vaut le coup d’être mentionné. Je trouve bien l’idée que Microsoft essaie d’aller dans le bon sens et inclus dans leur produit des petites fonctionnalités comme celle-ci. Moi, qui suis sensible à tout ça, cela me plaît beaucoup ;)

A bientôt.