Vytváření testů jednotek pro aplikace ASP.NET MVC (VB)
Naučte se vytvářet testy jednotek pro akce kontroleru. V tomto kurzu Stephen Walther ukazuje, jak otestovat, jestli akce kontroleru vrátí konkrétní zobrazení, vrátí určitou sadu dat nebo jiný typ výsledku akce.
Cílem tohoto kurzu je ukázat, jak můžete psát testy jednotek pro kontrolery v aplikacích ASP.NET MVC. Probereme, jak sestavit tři různé typy testů jednotek. Dozvíte se, jak otestovat zobrazení vrácené akcí kontroleru, jak otestovat akci Zobrazit data vrácená kontrolerem a jak otestovat, jestli vás jedna akce kontroleru přesměruje na druhou akci kontroleru.
Vytvoření kontroleru v rámci testu
Začněme vytvořením kontroleru, který chceme otestovat. Kontroler s názvem je obsažen ve výpisu ProductController
1.
Výpis 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
Obsahuje ProductController
dvě metody akce s názvem Index()
a Details()
. Obě metody akce vrátí zobrazení. Všimněte si, že Details()
akce přijímá parametr s názvem Id.
Testování zobrazení vráceného kontrolerem
Představte si, že chceme otestovat, jestli ProductController
vrací správné zobrazení. Chceme zajistit, aby se při vyvolání ProductController.Details()
akce vrátilo zobrazení Podrobnosti. Testovací třída ve výpisu 2 obsahuje test jednotek pro testování zobrazení vráceného ProductController.Details()
akcí.
Výpis 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
Třída ve výpisu 2 obsahuje testovací metodu s názvem TestDetailsView()
. Tato metoda obsahuje tři řádky kódu. První řádek kódu vytvoří novou instanci ProductController
třídy . Druhý řádek kódu vyvolá metodu akce kontroleru Details()
. Poslední řádek kódu nakonec zkontroluje, jestli je zobrazením vráceným Details()
akcí zobrazení Podrobnosti.
Vlastnost ViewResult.ViewName
představuje název zobrazení vráceného kontrolerem. Jedno velké upozornění týkající se testování této vlastnosti. Existují dva způsoby, jak může kontroler vrátit zobrazení. Kontroler může explicitně vrátit zobrazení podobné tomuto:
Function Details(ByVal Id As Integer)
Return View("Details")
End Function
Případně můžete název zobrazení odvodit z názvu akce kontroleru takto:
Function Details(ByVal Id As Integer)
Return View()
End Function
Tato akce kontroleru také vrátí zobrazení s názvem Details
. Název zobrazení je však odvozen z názvu akce. Pokud chcete otestovat název zobrazení, musíte explicitně vrátit název zobrazení z akce kontroleru.
Test jednotek ve výpisu 2 můžete spustit buď zadáním kombinace kláves Ctrl-R, A, nebo kliknutím na tlačítko Spustit všechny testy v řešení (viz obrázek 1). Pokud test projde, zobrazí se na obrázku 2 okno Výsledky testu.
Obrázek 01: Spustit všechny testy v řešení (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 02: Úspěch! (Kliknutím zobrazíte obrázek v plné velikosti.)
Testování zobrazení dat vrácených kontrolerem
Kontroler MVC předává data do zobrazení pomocí něčeho s názvem View Data
. Představte si například, že při vyvolání ProductController Details()
akce chcete zobrazit podrobnosti o konkrétním produktu. V takovém případě můžete vytvořit instanci třídy (definovanou Product
v modelu) a předat instanci zobrazení Details
pomocí .View Data
Pole změněné ProductController
v seznamu 3 obsahuje aktualizovanou Details()
akci, která vrátí produkt.
Výpis 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
Details()
Nejprve akce vytvoří novou instanci Product
třídy, která představuje přenosný počítač. Dále je instance Product
třídy předána jako druhý parametr View()
metodě .
Můžete napsat testy jednotek, které otestují, jestli jsou očekávaná data obsažena v zobrazení dat. Test jednotek ve výpisu 4 testuje, zda je při volání ProductController Details()
metody action vrácen produkt představující přenosný počítač.
Výpis 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
Ve výpisu TestDetailsView()
4 metoda testuje zobrazení dat vrácených voláním Details()
metody . Je ViewData
vystavena jako vlastnost vrácená ViewResult
vyvoláním Details()
metody . Vlastnost ViewData.Model
obsahuje produkt předaný do zobrazení. Test jednoduše ověří, že produkt obsažený v Zobrazení dat má název Laptop.
Testování výsledku akce vráceného kontrolerem
Složitější akce kontroleru může vrátit různé typy výsledků akce v závislosti na hodnotách parametrů předaných akci kontroleru. Akce kontroleru může vracet různé typy výsledků akce, včetně ViewResult
, RedirectToRouteResult
nebo JsonResult
.
Například upravená Details()
akce v seznamu 5 vrátí Details
zobrazení, když akci předáte platné ID produktu. Pokud předáte neplatné ID produktu – ID s hodnotou menší než 1 – budete přesměrováni Index()
na akci.
Výpis 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
Chování akce můžete otestovat pomocí testu jednotek ve výpisu Details()
6. Test jednotek ve výpisu 6 ověřuje, že jste přesměrováni do Index
zobrazení, když je metodě předáno Details()
ID s hodnotou -1.
Výpis 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
Při volání RedirectToAction()
metody v akci kontroleru vrátí RedirectToRouteResult
akce kontroleru . Test zkontroluje RedirectToRouteResult
, jestli se uživatel přesměruje na akci kontroleru s názvem Index
.
Souhrn
V tomto kurzu jste se naučili vytvářet testy jednotek pro akce kontroleru MVC. Nejprve jste se naučili, jak ověřit, jestli akce kontroleru vrací správné zobrazení. Zjistili jste, jak pomocí ViewResult.ViewName
vlastnosti ověřit název zobrazení.
Dále jsme prozkoumali, jak můžete otestovat obsah souboru View Data
. Zjistili jste, jak zkontrolovat, jestli se po volání akce kontroleru vrátil View Data
správný produkt.
Nakonec jsme probrali, jak můžete otestovat, jestli akce kontroleru vrací různé typy výsledků akce. Naučili jste se, jak otestovat, jestli kontroler vrací ViewResult
nebo RedirectToRouteResult
.