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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top