acciones del controlador de la unidad de pruebas con ViewModels complejos
-
16-09-2019 - |
Pregunta
sólo estoy yendo con ASP.NET MVC y yo también soy nuevo en la unidad de pruebas :) Hasta ahora, todo bien.
Tengo una acción de controlador que configura una vista de índice utilizando un modelo de vista. Prueba de la acción del controlador es directa, ya que puede pasar a una clase de servicio falsa en el constructor del controlador, pero mi modelo de vista es bastante complejo y va a buscar su propia clase de servicio en la creación de instancias.
Código debería hacer esto más claro espero ...
acción del controlador:
Function Index(ByVal id As Integer?) As ActionResult
Dim totalCount As Integer = 0
Dim selectedClient As Integer
If id Is Nothing Then
selectedClient = _portalClientService.GetFirstClient().ID
Else
selectedClient = id
End If
Dim users As MembershipUserCollection = _membershipService.GetUsersByClientId(selectedClient, 0, 1000, totalCount)
Return View(New UserListViewModel(users, selectedClient))
End Function
clase de modelo de vista:
Public Class UserListViewModel
Private _clientService As IPortalClientService
Public Sub New(ByVal users As MembershipUserCollection, ByVal selectedClient As Integer)
Me.New(users, selectedClient, Nothing)
End Sub
Public Sub New(ByVal users As MembershipUserCollection, ByVal selectedClient As Integer, ByVal clientService As IPortalClientService)
_users = users
_clientService = If(clientService, New PortalClientService)
_clients = New SelectList(_clientService.GetClients.OrderBy(Function(c) c.ClientName), "ID", "ClientName", selectedClient)
End Sub
Private _users As MembershipUserCollection
Public Property Users() As MembershipUserCollection
Get
Return _users
End Get
Set(ByVal value As MembershipUserCollection)
_users = value
End Set
End Property
Private _clients As SelectList
Public Property Clients() As SelectList
Get
Return _clients
End Get
Set(ByVal value As SelectList)
_clients = value
End Set
End Property
End Class
EDIT:
Cuando se prueba la acción del controlador, ¿cómo consigo el modelo de vista de utilizar una clase de servicio falso?
¿Debo abandonar el primer constructor y paso siempre al servicio del controlador o hay otra manera?
Saludos, España Nick
Solución
En realidad, este es un patrón que usamos todo el tiempo en nuestras API enfrenta públicas, y demuestra un buen uso de la inyección de dependencia. Me lo pase esto en una revisión de código sin problemas.
Su aplicación le da al usuario la opción de crear el objeto de forma flexible, y proporciona la capacidad de prueba.
El único "problema" es que sus pruebas no pueden cubrir fácilmente la una línea de código en el primer constructor, pero eso es sólo un problema si tienes a alguien que es un fanático de la cobertura de código - que suele ser un problema en sí mismo.
Otros consejos
Probablemente soy el pelo división, pero yo diría que su modelo es más un modelo de dominio de un modelo de vista. Eliminar la dependencia a la IPortalClientService
, o al menos no deje que el modelo de una instancia por sí mismo.
Yo prefiero para eliminar dichas dependencias lejos de la vista, y otra vez para el controlador.