2012-08-03 41 views
8

Estoy trabajando en este proyecto WebAPI y necesito crear pruebas unitarias para él. La base del proyecto se creó utilizando VS 2010, y luego se agregó un Módulo WebApi.C# WebApi Unidad de pruebas y Controladores de burla

El funcionamiento del controlador se interpone en el camino de las pruebas/burlas. Estoy usando xUnit y Moq, pero no hay absolutamente ninguna necesidad de seguir con esos dos.

La aplicación utiliza objetos específicos para tratar el acceso de base de datos, así que tengo la controllerObject y su contructor requiere la DataAccessObject

estoy teniendo un problema con el controlador burlarse/par DATAACCESS. La primera prueba que trato de ejecutar es GetAllFromDataBase, pero realmente no tengo ni idea de cómo hacerlo.

EDIT:

Hice lo que me dijo Cuong Le y el todo se está moviendo ahora, realmente apreciate ella. Pero me metí en otro problema. Para acceder a la API, hay un par de nombre de usuario/contraseña y mi controlador usa Thread.CurrentPrincipal.Identity.Name; ahora mismo necesitaría establecer este valor para que funcione completamente, supongo.

También el valueServiceMock.Setup (servicio => service.GetValues ​​()) .Returns (new [] { "valor1", "valor2"});

parece que no funciona. como el código intenta llegar a la base de datos, y no obtiene nada, ya que no puede obtener un nombre de usuario válido para buscar

+0

No debe burlarse del controlador, se burlaría de la servicios que el controlador necesita. Si estuvieras burlándose del controlador, no estarías probando el controlador. Ese es todo el punto. Eche un vistazo a esta publicación: http://www.peterprovost.org//blog/2012/06/16/unit-testing-asp-dot-net-web-api/ – tugberk

+0

¿Comprobó que pasa el objeto falso a través de constructor como este: var controller = new ValuesController (valueServiceMock.Object); –

Respuesta

18

Para que su aplicación sea comprobable, debe diseñar la capacidad de prueba en mente. Técnicamente, para diseñar la capacidad de prueba , su aplicación debe ser un acoplamiento flexible tanto como sea posible entre capas, entre componentes e incluso entre clases.

Una gran cantidad de consejos para el diseño de la capacidad de prueba: evitar sellado, clase estática ... Pero lo más popular que debe tener en cuenta es dependency injection pattern, en lugar de crear objetos dentro de contructors o métodos de otros objetos, este objeto debería ser inyectado. De esta manera hacemos una dependencia suelta entre clase y fácil para nosotros falso mediante burlarse del framework. Esp, para los objetos que dependen de recursos externos: red, archivo o base de datos.

Cómo inyectar un objeto usando la inyección de dependencia: por eso IocContainer es la herramienta adecuada para esto, se inyectará objetos automáticamente. IoC Container que prefiero usar es: Autofac y NInject.

Ejemplo aquí para inyectar ValueService en ValuesController:

public class ValuesController : ApiController 
{ 
    private readonly IValueService _valueService; 

    public ValuesController(IValueService valueService) 
    { 
     _valueService = valueService; 
    } 

    public string[] Get() 
    { 
     return _valueService.GetValues(); 
    } 

    public string Get(int id) 
    { 
     return _valueService.GetValue(id); 
    } 
} 

Y a continuación es el código simple de probar la unidad con Moq:

var valueServiceMock = new Mock<IValueService>(); 
valueServiceMock.Setup(service => service.GetValues()) 
      .Returns(new[] { "value1", "value2" }); 

var controller = new ValuesController(valueServiceMock.Object); 
var values = controller.Get(); 

Assert.AreEqual(values.Length, 2); 
Assert.AreEqual(values[0], "value1"); 
Assert.AreEqual(values[1], "value2"); 
+0

Hice lo que me dijiste y todo se está moviendo ahora, realmente lo aprecio. Pero me metí en otro problema. Para acceder a la API, hay un par de nombre de usuario/contraseña y mi controlador usa Thread.CurrentPrincipal.Identity.Nombre; – oSR

+0

Tenía la esperanza de que pudiera resolver esto aquí, pero vamos a hacer otra pregunta, entonces! – oSR

Cuestiones relacionadas