Sdílet prostřednictvím


Vytváření testů jednotek pro aplikace ASP.NET MVC (VB)

Stephen Walther

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

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.

Spustit všechny testy v řešení

Obrázek 01: Spustit všechny testy v řešení (kliknutím zobrazíte obrázek v plné velikosti)

Úspěch!

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, RedirectToRouteResultnebo 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í RedirectToRouteResultakce 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.