2012-07-26 13 views
7

Estoy intentando configurar una prueba con NUnit para realizar algunas pruebas de integración de controladores ASP.NET WebApi. He encontrado un par de artículos sobre el uso del Hosting In-Memory usando HttpServer que parece simplificar las cosas al no necesitar un servidor web que aloje todo.Uso de NUnit para realizar pruebas de integración con controladores ASP.NET WebApi

El problema es la única respuesta alguna vez 404-no se encuentra.

El controlador está funcionando cuando se prueba manualmente a través de un navegador o Fiddler. La definición de ruta fue copiada del sitio de trabajo. El proyecto de prueba hace referencia al proyecto api y el dll se copia en la misma carpeta que las pruebas.

Gracias de antemano.

Aquí está la clase de prueba

[TestFixture] 
public class InMemoryTests 
{ 
    private HttpServer Server; 
    private string UrlBase = "http://some.server/"; 

    [TestFixtureSetUp] 
    public void Setup() 
    { 

     var config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional }); 
     config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

     Server = new HttpServer(config); 
    } 

    [Test] 
    public void GetOrderStatus() 
    { 
     var client = new HttpClient(Server); 
     var request = createRequest("api/Orders/GetOrderStatus?companyCode=001&orderNumber=1234", "application/json", HttpMethod.Get); 

     using (HttpResponseMessage response = client.SendAsync(request).Result) 
     { 
      Assert.IsNotNull(response); 
      Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
      Assert.NotNull(response.Content); 
     } 
    } 

    private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method) 
    { 
     var request = new HttpRequestMessage(); 

     request.RequestUri = new Uri(UrlBase + url); 
     request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv)); 
     request.Method = method; 

     return request; 
    } 

    private HttpRequestMessage createRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class 
    { 
     HttpRequestMessage request = createRequest(url, mthv, method); 
     request.Content = new ObjectContent<T>(content, formatter); 

     return request; 
    } 

    public void Dispose() 
    { 
     if (Server != null) 
     { 
      Server.Dispose(); 
     } 
    } 
} 
+0

esto se ve bien. Difícil de decir sin ver el controlador. ¿Podría publicar la definición para esta acción/api/Orders/GetOrderStatus? CompanyCode = 001 & orderNumber = 1234? –

+0

Nada realmente especial sobre el controlador. Todo funciona cuando se prueba manualmente. También obtengo el mismo resultado sin importar qué controlador pruebo. – Rick

Respuesta

8

que estaba viendo este problema también, parecía que se fuera cuando moví mi clase de prueba en el mismo conjunto como mi controlador; generalmente no es práctico para las pruebas que yo sé.

Después de excavar un poco, parece que hay un error que solo se produce con el host propio cuando el código de llamada no comparte el mismo ensamblaje que el controlador, ya que no ha podido cargar los ensamblados necesarios.

Para confirmar este es su problema/solución temporal añadir esto como la primera línea de la prueba: -

Type myType = typeof(myControllerType); 

Más información en: http://forums.asp.net/t/1772734.aspx/1

+0

Marcando su respuesta como correcta. También publiqué mi pregunta en los foros asp.net y obtuve la misma respuesta. Tuve que trabajar un poco más porque también tuve que asegurarme de que todas las dependencias requeridas por los controladores estén disponibles (¡duh!) Http://forums.asp.net/t/1829098.aspx/1?Using+HttpServer+to + realizar + integración + prueba + con + NUnit – Rick

+0

¿Por qué es este el caso? También tuve esto donde si pongo el método de prueba en el mismo conjunto funcionaba, pero si lo pongo en otro lugar, como en el proyecto de prueba, no funcionaría. – appsecguy

+0

Este problema me ha estado molestando durante los últimos dos días. ¡Gracias ASÍ! – Jethro

Cuestiones relacionadas