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 ProductController
liste 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.
Figure 01 : Exécuter tous les tests dans la solution (cliquez pour afficher l’image en taille réelle)
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 , ViewResult
RedirectToRouteResult
ou 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
.