2012-05-01 25 views
5

Tengo un 4 WebAPI ASP.net MVC (beta) que se ve algo como esto:ASP.net MVC 4 WebAPI - Pruebas de contenido MIME de varias

public void Post() 
    { 
     if (!Request.Content.IsMimeMultipartContent("form-data")) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 

     IEnumerable<HttpContent> parts = Request.Content.ReadAsMultipartAsync().Result; 

     // Rest of code here. 
    } 

estoy tratando de probar la unidad este código, pero puede No sé cómo hacerlo. ¿Estoy en el camino correcto aquí?

[TestMethod] 
    public void Post_Test() 
    { 
     MultipartFormDataContent content = new MultipartFormDataContent(); 
     content.Add(new StringContent("bar"), "foo"); 

     this.controller.Request = new HttpRequestMessage(); 
     this.controller.Request.Content = content; 
     this.controller.Post(); 
    } 

Este código está lanzando la excepción siguiente: Se ha producido uno o más errores:

System.AggregateException. ---> System.IO.IOException: final imprevisto de MIME transmisión de varias partes. MIME mensaje de varias partes no está completo. en System.Net.Http.MimeMultipartBodyPartParser.d__0.MoveNext() en System.Net.Http.HttpContentMultipartExtensions.MoveNextPart (MultipartAsyncContext contexto) en System.Net.Http.HttpContentMultipartExtensions.MultipartReadAsyncComplete (IAsyncResult resultado) en System.Net.Http.HttpContentMultipartExtensions.OnMultipartReadAsyncComplete (IAsyncResult resultado)

Alguna idea de cuál es la mejor manera de hacer esto es?

Respuesta

10

Aunque la pregunta fue publicada hace un tiempo, tuve que lidiar con el mismo tipo de problema.

Esta fue mi solución:

Crear una aplicación falsa de la clase HttpControllerContext donde se agrega a la MultipartFormDataContent HttpRequestMessage.

public class FakeControllerContextWithMultiPartContentFactory 
{ 
    public static HttpControllerContext Create() 
    { 
     var request = new HttpRequestMessage(HttpMethod.Post, ""); 
     var content = new MultipartFormDataContent(); 

     var fileContent = new ByteArrayContent(new Byte[100]); 
     fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
     { 
      FileName = "Foo.txt" 
     }; 
     content.Add(fileContent); 
     request.Content = content; 

     return new HttpControllerContext(new HttpConfiguration(), new HttpRouteData(new HttpRoute("")), request); 
    } 

} 

después en su prueba:

[TestMethod] 
    public void Should_return_OK_when_valid_file_posted() 
    { 
     //Arrange 
     var sut = new yourController(); 

     sut.ControllerContext = FakeControllerContextWithMultiPartContentFactory.Create(); 

     //Act 
     var result = sut.Post(); 

     //Arrange 
     Assert.IsType<OkResult>(result.Result); 
    } 
+1

Ese método es sorprendentemente simple y más fácil de implementar que un montón de otros que he visto. – BrianS

+0

agradable agradable agradable! Gracias hermano –

+0

Muy simple, limpio y agradable, gracias! –

Cuestiones relacionadas