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 ProductControllerNamen ist in Listing 1 enthalten.
Eintrag 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
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.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
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:
Function Details(ByVal Id As Integer)
Return View("Details")
End Function
Alternativ kann der Name der Ansicht aus dem Namen der Controlleraktion wie folgt abgeleitet werden:
Function Details(ByVal Id As Integer)
Return View()
End Function
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 Datanutzen.
Die in Listing 3 geänderte ProductController enthält eine aktualisierte Details() Aktion, die ein Produkt zurückgibt.
Eintrag 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
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.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
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 , ViewResultRedirectToRouteResultoder 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.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
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.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
Wenn Sie die RedirectToAction() -Methode in einer Controlleraktion aufrufen, gibt die Controlleraktion einen RedirectToRouteResultzurück. Der Test überprüft, ob der RedirectToRouteResult benutzer zu einer Controlleraktion mit dem Namen Indexumgeleitet 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 Datatesten 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 RedirectToRouteResultzurückgibt.