Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Stephen Walther
Erfahren Sie, wie Sie Komponententests für Controlleraktionen erstellen. In diesem Tutorial veranschaulicht Stephen Walther, wie getestet wird, ob eine Controlleraktion eine bestimmte Sicht zurückgibt, einen bestimmten Satz von Daten zurückgibt oder einen anderen Typ von Aktionsergebnissen zurückgibt.
Das Ziel dieses Tutorials besteht darin, zu veranschaulichen, wie Sie Komponententests für die Controller in Ihren ASP.NET MVC-Anwendungen schreiben können. Wir diskutieren, wie Sie drei verschiedene Arten von Komponententests erstellen. Sie erfahren, wie Sie die von einer Controlleraktion zurückgegebene Ansicht testen, wie Sie die von einer Controlleraktion zurückgegebenen Daten anzeigen testen und testen, ob eine Controlleraktion Sie zu einer zweiten Controlleraktion umleitet.
Erstellen des Controllers unter Test
Beginnen wir damit, den Controller zu erstellen, den wir testen möchten. Der Controller mit dem ProductController
Namen ist in Listing 1 enthalten.
Eintrag 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");
}
}
}
Enthält ProductController
zwei Aktionsmethoden mit dem Namen Index()
und Details()
. Beide Aktionsmethoden geben eine Ansicht zurück. Beachten Sie, dass die Details()
Aktion einen Parameter mit dem Namen Id akzeptiert.
Testen der von einem Controller zurückgegebenen Ansicht
Stellen Sie sich vor, wir möchten testen, ob die ProductController
richtige Ansicht zurückgibt oder nicht. Wir möchten sicherstellen, dass beim Aufrufen der ProductController.Details()
Aktion die Detailansicht zurückgegeben wird. Die Testklasse in Listing 2 enthält einen Komponententest zum Testen der von der ProductController.Details()
Aktion zurückgegebenen Ansicht.
Eintrag 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);
}
}
}
Die -Klasse in Listing 2 enthält eine Testmethode mit dem Namen TestDetailsView()
. Diese Methode enthält drei Codezeilen. Mit der ersten Codezeile wird eine neue instance der ProductController
-Klasse erstellt. Die zweite Codezeile ruft die Aktionsmethode des Details()
Controllers auf. Schließlich überprüft die letzte Codezeile, ob die von der Details()
Aktion zurückgegebene Ansicht die Detailansicht ist.
Die ViewResult.ViewName
-Eigenschaft stellt den Namen der Ansicht dar, die von einem Controller zurückgegeben wird. Eine große Warnung zum Testen dieser Eigenschaft. Es gibt zwei Möglichkeiten, wie ein Controller eine Ansicht zurückgeben kann. Ein Controller kann eine Ansicht wie folgt explizit zurückgeben:
public ActionResult Details(int Id)
{
return View("Details");
}
Alternativ kann der Name der Ansicht aus dem Namen der Controlleraktion wie folgt abgeleitet werden:
public ActionResult Details(int Id)
{
return View();
}
Diese Controlleraktion gibt auch eine Ansicht mit dem Namen zurück Details
. Der Name der Ansicht wird jedoch aus dem Aktionsnamen abgeleitet. Wenn Sie den Ansichtsnamen testen möchten, müssen Sie den Ansichtsnamen explizit aus der Controlleraktion zurückgeben.
Sie können den Komponententest in Listing 2 ausführen, indem Sie entweder die Tastenkombination STRG-R, A eingeben oder auf die Schaltfläche Alle Tests in Lösung ausführen klicken (siehe Abbildung 1). Wenn der Test erfolgreich ist, wird das Fenster Testergebnisse in Abbildung 2 angezeigt.
Abbildung 01: Ausführen aller Tests in der Projektmappe (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Abbildung 02: Erfolg! (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Testen der von einem Controller zurückgegebenen Daten anzeigen
Ein MVC-Controller übergibt Daten an eine Ansicht, indem er etwas namens verwendet View Data
. Stellen Sie sich beispielsweise vor, sie möchten die Details für ein bestimmtes Produkt anzeigen, wenn Sie die ProductController Details()
Aktion aufrufen. In diesem Fall können Sie eine instance einer Product
Klasse (in Ihrem Modell definiert) erstellen und die instance an die Details
Ansicht übergeben, indem Sie die Vorteile von View Data
nutzen.
Die in Listing 3 geänderte ProductController
enthält eine aktualisierte Details()
Aktion, die ein Produkt zurückgibt.
Eintrag 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);
}
}
}
Zunächst erstellt die Details()
Aktion eine neue instance der Klasse, die Product
einen Laptopcomputer darstellt. Als Nächstes wird der instance der Product
-Klasse als zweiter Parameter an die View()
-Methode übergeben.
Sie können Komponententests schreiben, um zu testen, ob die erwarteten Daten in Ansichtsdaten enthalten sind. Der Komponententest in Listing 4 testet, ob ein Produkt zurückgegeben wird, das einen Laptop darstellt, wenn Sie die ProductController Details()
Aktionsmethode aufrufen.
Eintrag 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);
}
}
}
In Listing 4 testet die TestDetailsView()
Methode die zurückgegebenen Daten anzeigen, indem sie die Details()
-Methode aufruft. Wird ViewData
als Eigenschaft für zurückgegebene ViewResult
verfügbar gemacht, indem die Details()
-Methode aufgerufen wird. Die ViewData.Model
-Eigenschaft enthält das Produkt, das an die Ansicht übergeben wird. Der Test überprüft einfach, ob das in der Datenansicht enthaltene Produkt den Namen Laptop hat.
Testen des von einem Controller zurückgegebenen Aktionsergebnisses
Eine komplexere Controlleraktion kann verschiedene Arten von Aktionsergebnissen zurückgeben, abhängig von den Werten der Parameter, die an die Controlleraktion übergeben werden. Eine Controlleraktion kann verschiedene Arten von Aktionsergebnissen zurückgeben, einschließlich , ViewResult
RedirectToRouteResult
oder JsonResult
.
Die geänderte Details()
Aktion in Listing 5 gibt beispielsweise die Details
Ansicht zurück, wenn Sie eine gültige Produkt-ID an die Aktion übergeben. Wenn Sie eine ungültige Produkt-ID übergeben – eine ID mit einem Wert kleiner als 1 –, werden Sie zur Index()
Aktion weitergeleitet.
Eintrag 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);
}
}
}
Sie können das Verhalten der Details()
Aktion mit dem Komponententest in Listing 6 testen. Der Komponententest in Listing 6 überprüft, ob Sie zur Index
Ansicht weitergeleitet werden, wenn eine ID mit dem Wert -1 an die Details()
-Methode übergeben wird.
Eintrag 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"]);
}
}
}
Wenn Sie die RedirectToAction()
-Methode in einer Controlleraktion aufrufen, gibt die Controlleraktion einen RedirectToRouteResult
zurück. Der Test überprüft, ob der RedirectToRouteResult
benutzer zu einer Controlleraktion mit dem Namen Index
umgeleitet wird.
Zusammenfassung
In diesem Tutorial haben Sie gelernt, wie Sie Komponententests für MVC-Controlleraktionen erstellen. Zunächst haben Sie gelernt, wie Sie überprüfen, ob die richtige Ansicht von einer Controlleraktion zurückgegeben wird. Sie haben gelernt, wie Sie die ViewResult.ViewName
-Eigenschaft verwenden, um den Namen einer Ansicht zu überprüfen.
Als Nächstes haben wir untersucht, wie Sie den Inhalt von View Data
testen können. Sie haben gelernt, wie Sie nach dem Aufrufen einer Controlleraktion überprüfen, ob das richtige Produkt zurückgegeben View Data
wurde.
Abschließend wurde erläutert, wie Sie testen können, ob verschiedene Arten von Aktionsergebnissen von einer Controlleraktion zurückgegeben werden. Sie haben gelernt, wie Sie testen, ob ein Controller ein ViewResult
oder ein RedirectToRouteResult
zurückgibt.