Condividi tramite


Creazione di unit test per le applicazioni ASP.NET MVC (VB)

di Stephen Walther

Informazioni su come creare unit test per le azioni del controller. In questa esercitazione Stephen Walther illustra come testare se un'azione del controller restituisce una visualizzazione specifica, restituisce un determinato set di dati o restituisce un tipo diverso di risultato dell'azione.

L'obiettivo di questa esercitazione è illustrare come scrivere unit test per i controller nelle applicazioni MVC ASP.NET. Viene illustrato come creare tre diversi tipi di unit test. Si apprenderà come testare la visualizzazione restituita da un'azione del controller, come testare i dati di visualizzazione restituiti da un'azione del controller e come testare se un'azione del controller reindirizza l'utente a una seconda azione controller.

Creazione del controller in Test

Si inizierà creando il controller che si intende testare. Il controller, denominato , è contenuto nell'elenco ProductController1.

Elenco 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

Contiene ProductController due metodi di azione denominati Index() e Details(). Entrambi i metodi di azione restituiscono una visualizzazione. Si noti che l'azione Details() accetta un parametro denominato ID.

Test della visualizzazione restituita da un controller

Si supponga di voler testare se il ProductController valore restituisce la visualizzazione corretta. Si vuole assicurarsi che quando viene richiamata l'azione, viene restituita la ProductController.Details() visualizzazione Dettagli. La classe di test in List 2 contiene un unit test per testare la visualizzazione restituita dall'azione ProductController.Details() .

Presentazione 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

La classe in List 2 include un metodo di test denominato TestDetailsView(). Questo metodo contiene tre righe di codice. La prima riga di codice crea una nuova istanza della ProductController classe. La seconda riga di codice richiama il metodo di azione del Details() controller. Infine, l'ultima riga di codice verifica se la visualizzazione restituita dall'azione Details() è la visualizzazione Dettagli.

La ViewResult.ViewName proprietà rappresenta il nome della visualizzazione restituita da un controller. Un grande avviso relativo al test di questa proprietà. Esistono due modi in cui un controller può restituire una visualizzazione. Un controller può restituire in modo esplicito una visualizzazione simile al seguente:

Function Details(ByVal Id As Integer)
     Return View("Details")
End Function

In alternativa, il nome della visualizzazione può essere dedotto dal nome dell'azione del controller, come illustrato di seguito:

Function Details(ByVal Id As Integer)
     Return View()
End Function

Questa azione controller restituisce anche una visualizzazione denominata Details. Tuttavia, il nome della visualizzazione viene dedotto dal nome dell'azione. Se si vuole testare il nome della visualizzazione, è necessario restituire in modo esplicito il nome della visualizzazione dall'azione del controller.

È possibile eseguire lo unit test nell'elenco 2 immettendo la combinazione di tastiera CTRL-R, A o facendo clic sul pulsante Esegui tutti i test nella soluzione (vedere la figura 1). Se il test supera, verrà visualizzata la finestra Risultati test nella figura 2.

Eseguire tutti i test nella soluzione

Figura 01: Eseguire tutti i test nella soluzione (fare clic per visualizzare l'immagine full-size)

Successo!

Figura 02: Successo! (Fare clic per visualizzare l'immagine full-size)

Test dei dati di visualizzazione restituiti da un controller

Un controller MVC passa i dati a una visualizzazione usando un elemento denominato View Data. Si supponga, ad esempio, di voler visualizzare i dettagli di un determinato prodotto quando si richiama l'azione ProductController Details() . In tal caso, è possibile creare un'istanza di una Product classe (definita nel modello) e passare l'istanza alla Details vista sfruttando View Data.

La modifica ProductController nell'elenco 3 include un'azione aggiornata Details() che restituisce un prodotto.

Elenco 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

Prima di tutto, l'azione Details() crea una nuova istanza della Product classe che rappresenta un computer portatile. Successivamente, l'istanza della Product classe viene passata come secondo parametro al View() metodo.

È possibile scrivere unit test per verificare se i dati previsti sono contenuti nei dati di visualizzazione. L'unit test nell'elenco 4 verifica se un prodotto che rappresenta un computer portatile viene restituito quando si chiama il ProductController Details() metodo di azione.

Elenco 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

Nell'elenco 4 il TestDetailsView() metodo testa i dati visualizzati restituiti richiamando il Details() metodo . L'oggetto ViewData viene esposto come proprietà nell'oggetto ViewResult restituito richiamando il Details() metodo . La ViewData.Model proprietà contiene il prodotto passato alla visualizzazione. Il test verifica semplicemente che il prodotto contenuto in View Data abbia il nome Laptop.

Test del risultato azione restituito da un controller

Un'azione controller più complessa potrebbe restituire diversi tipi di risultati delle azioni a seconda dei valori dei parametri passati all'azione del controller. Un'azione controller può restituire un'ampia gamma di tipi di risultati dell'azione, tra cui un ViewResultoggetto , RedirectToRouteResulto JsonResult.

Ad esempio, l'azione modificata Details() nell'elenco 5 restituisce la Details visualizzazione quando si passa un ID prodotto valido all'azione. Se si passa un ID prodotto non valido, un ID con un valore minore di 1, viene eseguito il reindirizzamento all'azione Index() .

Elenco 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

È possibile testare il comportamento dell'azione con l'unit test nell'elenco Details() 6. L'unit test nell'elenco Index 6 verifica che venga reindirizzato alla visualizzazione quando viene passato un ID con il valore -1 al Details() metodo.

Elenco 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

Quando si chiama il RedirectToAction() metodo in un'azione controller, l'azione controller restituisce un RedirectToRouteResultoggetto . Il test verifica se l'utente RedirectToRouteResult reindirizzerà l'utente a un'azione controller denominata Index.

Riepilogo

In questa esercitazione si è appreso come compilare unit test per le azioni del controller MVC. Prima di tutto, si è appreso come verificare se la visualizzazione corretta viene restituita da un'azione del controller. Si è appreso come usare la ViewResult.ViewName proprietà per verificare il nome di una visualizzazione.

Successivamente, è stato esaminato come testare il contenuto di View Data. Si è appreso come verificare se il prodotto corretto è stato restituito View Data dopo aver chiamato un'azione del controller.

Infine, è stato illustrato come verificare se vengono restituiti diversi tipi di risultati dell'azione da un'azione controller. Si è appreso come testare se un controller restituisce un ViewResult oggetto o un RedirectToRouteResultoggetto .