Freigeben über


Erstellen von Komponententests für ASP.NET MVC-Anwendungen (C#)

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.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.

Ausführen aller Tests in der Projektmappe

Abbildung 01: Ausführen aller Tests in der Projektmappe (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Erfolg!

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.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 , 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.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 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.