Création de tests unitaires pour les applications ASP.NET MVC (C#)
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 de votre ASP.NET applications MVC. Nous expliquons comment créer trois types différents de tests unitaires. Vous allez apprendre à tester l’affichage retourné par une action de contrôleur, à tester l’option Afficher les données retournées par une action de 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 sous test
Commençons par créer le contrôleur que nous avons l’intention de tester. Le contrôleur, nommé , se trouve dans la ProductController
liste 1.
Référencement 1 – ProductController.cs
using System;
using System.Web.Mvc;
namespace Store.Controllers
{
public class ProductController : Controller
{
public ActionResult Index()
{
// Add action logic here
throw new NotImplementedException();
}
public ActionResult Details(int Id)
{
return View("Details");
}
}
}
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 l’affichage retourné par un contrôleur
Imaginez que nous voulons tester si le ProductController
retourne ou non la vue appropriée. Nous voulons nous assurer que lorsque l’action ProductController.Details()
est appelée, la vue Détails est retournée. La classe de test de la liste 2 contient un test unitaire pour tester la vue retournée par l’action ProductController.Details()
.
Référencement 2 – ProductControllerTest.cs
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Store.Controllers;
namespace StoreTests.Controllers
{
[TestClass]
public class ProductControllerTest
{
[TestMethod]
public void TestDetailsView()
{
var controller = new ProductController();
var result = controller.Details(2) as ViewResult;
Assert.AreEqual("Details", result.ViewName);
}
}
}
La classe de 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 suit :
public ActionResult Details(int Id)
{
return View("Details");
}
Vous pouvez également déduire le nom de la vue à partir du nom de l’action du contrôleur comme suit :
public ActionResult Details(int Id)
{
return View();
}
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 de 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, la fenêtre Résultats des tests apparaît dans la figure 2.
Figure 01 : Exécuter tous les tests dans la solution (cliquer pour afficher l’image en taille réelle)
Figure 02 : Réussite ! (Cliquez pour afficher l’image en taille réelle)
Test des données d’affichage 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.
Référencement 3 – ProductController.cs
using System;
using System.Web.Mvc;
namespace Store.Controllers
{
public class ProductController : Controller
{
public ActionResult Index()
{
// Add action logic here
throw new NotImplementedException();
}
public ActionResult Details(int Id)
{
var product = new Product(Id, "Laptop");
return View("Details", product);
}
}
}
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 d’affichage. Le test unitaire de la liste 4 vérifie si un produit représentant un ordinateur portable est retourné lorsque vous appelez la ProductController Details()
méthode d’action.
Référencement 4 – ProductControllerTest.cs
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Store.Controllers;
namespace StoreTests.Controllers
{
[TestClass]
public class ProductControllerTest
{
[TestMethod]
public void TestDetailsViewData()
{
var controller = new ProductController();
var result = controller.Details(2) as ViewResult;
var product = (Product) result.ViewData.Model;
Assert.AreEqual("Laptop", product.Name);
}
}
}
Dans la liste 4, la TestDetailsView()
méthode teste les données d’affichage retournées en appelant la Details()
méthode. est ViewData
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 a le nom Ordinateur portable.
Test du résultat d’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 un ViewResult
, RedirectToRouteResult
ou JsonResult
.
Par exemple, l’action modifiée Details()
dans la liste 5 retourne l’affichage Details
lorsque vous passez un ID de produit valide à l’action. Si vous transmettez un ID de produit non valide, un ID dont la valeur est inférieure à 1, vous êtes redirigé vers l’action Index()
.
Liste 5 – ProductController.cs
using System;
using System.Web.Mvc;
namespace Store.Controllers
{
public class ProductController : Controller
{
public ActionResult Index()
{
// Add action logic here
throw new NotImplementedException();
}
public ActionResult Details(int Id)
{
if (Id < 1)
return RedirectToAction("Index");
var product = new Product(Id, "Laptop");
return View("Details", product);
}
}
}
Vous pouvez tester le comportement de l’action Details()
avec le test unitaire dans la liste 6. Le test unitaire de 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.
Référencement 6 – ProductControllerTest.cs
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Store.Controllers;
namespace StoreTests.Controllers
{
[TestClass]
public class ProductControllerTest
{
[TestMethod]
public void TestDetailsRedirect()
{
var controller = new ProductController();
var result = (RedirectToRouteResult) controller.Details(-1);
Assert.AreEqual("Index", result.Values["action"]);
}
}
}
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 le RedirectToRouteResult
redirige l’utilisateur vers une action de contrôleur nommée Index
.
Résumé
Dans ce tutoriel, vous avez appris à générer 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 tester le contenu de View Data
. Vous avez appris à case activée si le bon produit a été retourné après View Data
l’appel d’une action de 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
.