2012-05-01 9 views
5

मैं एक ASP.net MVC 4 (बीटा) WebAPI कि कुछ इस तरह दिखता है:ASP.net MVC 4 WebAPI - परीक्षण माइम मल्टीपार्ट सामग्री

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: एमआईएमई मल्टीपार्ट स्ट्रीम का अप्रत्याशित अंत। एमआईएम मल्टीपार्ट संदेश पूरा नहीं हुआ है। पर 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

अल्टो सवाल कुछ समय पहले पोस्ट किया गया था, मुझे बस उसी तरह की समस्या से निपटना पड़ा।

जहां HttpRequestMessage को MultipartFormDataContent जोड़ने HttpControllerContext वर्ग के एक नकली कार्यान्वयन बनाएँ:

यह मेरा समाधान था।

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

अच्छा अच्छा अच्छा है! धन्यवाद ब्रो –

+0

बहुत सरल, साफ और अच्छा, धन्यवाद! –

संबंधित मुद्दे