2012-05-01 3 views
5

У меня есть 4 (бета) WebAPI ASP.net MVC, который выглядит примерно так:ASP.net MVC 4 WebAPI - Тестирование MIME Multipart Content

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. 
    } 

Я пытаюсь модульного тестирования этого кода, но может Подумайте, как это сделать. Я здесь, на правильном пути?

[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(); 
    } 

Этот код бросает следующее исключение: Произошла одна или несколько ошибок:

System.AggregateException. ---> System.IO.IOException: Неожиданный конец многопоточного потока MIME. MIME multipart сообщение не является полным. на System.Net.Http.MimeMultipartBodyPartParser.d__0.MoveNext() на System.Net.Http.HttpContentMultipartExtensions.MoveNextPart (MultipartAsyncContext контекста) при System.Net.Http.HttpContentMultipartExtensions.MultipartReadAsyncComplete (IAsyncResult результата) при System.Net.Http.HttpContentMultipartExtensions.OnMultipartReadAsyncComplete (IAsyncResult результат)

Любая идея, что лучший способ сделать это?

ответ

10

Прежде, чем вопрос был опубликован некоторое время назад, мне просто пришлось иметь дело с такой же проблемой.

Это было мое решение:

Создать поддельный реализацию класса HttpControllerContext, где вы добавляете 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); 
    } 

} 

затем в тесте:

[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

Этот метод удивительно прост и проще реализовать, чем многие из тех, что я видел. – BrianS

+0

приятно приятно! Спасибо bro –

+0

Очень простой, чистый и приятный, спасибо! –

Смежные вопросы