Partager via


Création de tests unitaires pour les applications ASP.NET MVC (VB)

par Stephen Walther

Découvrez comment créer des tests unitaires pour les actions du contrôleur. Dans ce tutoriel, Stephen Walther montre comment tester si une action de contrôleur retourne une vue particulière, retourne un jeu de données particulier ou retourne un autre type de résultat d’action.

L’objectif de ce tutoriel est de montrer comment écrire des tests unitaires pour les contrôleurs dans vos applications ASP.NET MVC. Nous expliquons comment créer trois types différents de tests unitaires. Vous allez apprendre à tester la vue retournée par une action de contrôleur, à tester l’action Afficher les données retournées par un contrôleur et à tester si une action de contrôleur vous redirige vers une deuxième action de contrôleur.

Création du contrôleur en cours de test

Commençons par créer le contrôleur que nous avons l’intention de tester. Le contrôleur, nommé , est contenu dans la ProductControllerliste 1.

Listing 1 – ProductController.vb

Public Class ProductController
     Inherits System.Web.Mvc.Controller

     Function Index()
          ' Add action logic here
          Throw New NotImplementedException()
     End Function

     Function Details(ByVal Id As Integer)
          Return View("Details")
     End Function
End Class

contient ProductController deux méthodes d’action nommées Index() et Details(). Les deux méthodes d’action retournent une vue. Notez que l’action Details() accepte un paramètre nommé Id.

Test de la vue retournée par un contrôleur

Imaginez que nous souhaitions tester si le ProductController retourne ou non la bonne vue. Nous voulons nous assurer que lorsque l’action ProductController.Details() est appelée, la vue Détails est retournée. La classe de test dans listing 2 contient un test unitaire pour tester la vue retournée par l’action ProductController.Details() .

Listing 2 – ProductControllerTest.vb

Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System.Web.Mvc
Imports Store

<TestClass()> Public Class ProductControllerTest
     <TestMethod()> Public Sub TestDetailsView()
          Dim controller As New ProductController()
          Dim result As ViewResult = controller.Details(2)
          Assert.AreEqual("Details", result.ViewName)

     End Sub
End Class

La classe dans listing 2 inclut une méthode de test nommée TestDetailsView(). Cette méthode contient trois lignes de code. La première ligne de code crée une nouvelle instance de la ProductController classe . La deuxième ligne de code appelle la méthode d’action du Details() contrôleur. Enfin, la dernière ligne de code vérifie si la vue retournée par l’action Details() est la vue Détails.

La ViewResult.ViewName propriété représente le nom de la vue retournée par un contrôleur. Un avertissement important concernant le test de cette propriété. Il existe deux façons pour un contrôleur de retourner une vue. Un contrôleur peut retourner explicitement une vue comme celle-ci :

Function Details(ByVal Id As Integer)
     Return View("Details")
End Function

Vous pouvez également déduire le nom de la vue à partir du nom de l’action du contrôleur comme suit :

Function Details(ByVal Id As Integer)
     Return View()
End Function

Cette action de contrôleur retourne également une vue nommée Details. Toutefois, le nom de la vue est déduit du nom de l’action. Si vous souhaitez tester le nom de la vue, vous devez retourner explicitement le nom de la vue à partir de l’action du contrôleur.

Vous pouvez exécuter le test unitaire dans la liste 2 en entrant la combinaison clavier Ctrl-R, A ou en cliquant sur le bouton Exécuter tous les tests dans la solution (voir figure 1). Si le test réussit, vous verrez la fenêtre Résultats du test dans la figure 2.

Exécuter tous les tests dans la solution

Figure 01 : Exécuter tous les tests dans la solution (cliquez pour afficher l’image en taille réelle)

Succès!

Figure 02 : Réussite ! (Cliquez pour afficher l’image en taille réelle)

Test de l’affichage des données retournées par un contrôleur

Un contrôleur MVC transmet des données à une vue à l’aide de quelque chose appelé View Data. Par exemple, imaginez que vous souhaitez afficher les détails d’un produit particulier lorsque vous appelez l’action ProductController Details() . Dans ce cas, vous pouvez créer une instance d’une Product classe (définie dans votre modèle) et passer le instance à la Details vue en tirant parti de View Data.

Le modifié ProductController dans la liste 3 inclut une action mise à jour Details() qui retourne un produit.

Listing 3 – ProductController.vb

Public Class ProductController
     Inherits System.Web.Mvc.Controller

     Function Index()
          ' Add action logic here
          Throw New NotImplementedException()
     End Function

     Function Details(ByVal Id As Integer)
          Dim product As New Product(Id, "Laptop")
          Return View("Details", product)
     End Function
End Class

Tout d’abord, l’action Details() crée une nouvelle instance de la Product classe qui représente un ordinateur portable. Ensuite, le instance de la Product classe est passé en tant que deuxième paramètre à la View() méthode .

Vous pouvez écrire des tests unitaires pour vérifier si les données attendues sont contenues dans les données de la vue. Le test unitaire de la liste 4 teste si un produit représentant un ordinateur portable est retourné lorsque vous appelez la ProductController Details() méthode d’action.

Listing 4 – ProductControllerTest.vb

Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System.Web.Mvc
Imports Store

<TestClass()> Public Class ProductControllerTest

     <TestMethod()> Public Sub TestDetailsViewData()
          Dim controller As New ProductController()
          Dim result As ViewResult = controller.Details(2)
          Dim product As Product = result.ViewData.Model
          Assert.AreEqual("Laptop", product.Name)
     End Sub
End Class

Dans la liste 4, la TestDetailsView() méthode teste les données d’affichage retournées en appelant la Details() méthode . le ViewData est exposé en tant que propriété sur le ViewResult retourné en appelant la Details() méthode . La ViewData.Model propriété contient le produit passé à la vue. Le test vérifie simplement que le produit contenu dans l’affichage des données porte le nom Laptop.

Test du résultat de l’action retourné par un contrôleur

Une action de contrôleur plus complexe peut retourner différents types de résultats d’action en fonction des valeurs des paramètres passés à l’action du contrôleur. Une action de contrôleur peut retourner divers types de résultats d’action, notamment , ViewResultRedirectToRouteResultou JsonResult.

Par exemple, l’action modifiée Details() dans la liste 5 retourne la Details vue lorsque vous passez un ID de produit valide à l’action. Si vous passez un ID de produit non valide , un ID dont la valeur est inférieure à 1, vous êtes redirigé vers l’action Index() .

Listing 5 – ProductController.vb

Public Class ProductController
     Inherits System.Web.Mvc.Controller

     Function Index()
          ' Add action logic here
          Throw New NotImplementedException()
     End Function

     Function Details(ByVal Id As Integer)
          If Id < 1 Then
               Return RedirectToAction("Index")
          End If
          Dim product As New Product(Id, "Laptop")
          Return View("Details", product)
     End Function
End Class

Vous pouvez tester le comportement de l’action Details() avec le test unitaire dans la liste 6. Le test unitaire dans la liste 6 vérifie que vous êtes redirigé vers la Index vue lorsqu’un ID avec la valeur -1 est passé à la Details() méthode.

Listing 6 – ProductControllerTest.vb

Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System.Web.Mvc
Imports Store

<TestClass()> Public Class ProductControllerTest

     <TestMethod()> Public Sub TestDetailsRedirect()
          Dim controller As New ProductController()
          Dim result As RedirectToRouteResult = controller.Details(-1)
          Assert.AreEqual("Index", result.Values("action"))
     End Sub
End Class

Lorsque vous appelez la RedirectToAction() méthode dans une action de contrôleur, l’action du contrôleur retourne un RedirectToRouteResult. Le test vérifie si redirige RedirectToRouteResult l’utilisateur vers une action de contrôleur nommée Index.

Résumé

Dans ce tutoriel, vous avez appris à créer des tests unitaires pour les actions du contrôleur MVC. Tout d’abord, vous avez appris à vérifier si la vue appropriée est retournée par une action de contrôleur. Vous avez appris à utiliser la ViewResult.ViewName propriété pour vérifier le nom d’une vue.

Ensuite, nous avons examiné comment vous pouvez tester le contenu de View Data. Vous avez appris à case activée si le produit approprié a été retourné après l’appel d’une action de View Data contrôleur.

Enfin, nous avons expliqué comment tester si différents types de résultats d’action sont retournés à partir d’une action de contrôleur. Vous avez appris à tester si un contrôleur retourne un ViewResult ou un RedirectToRouteResult.