0

나는 Controller을 (DotNetZip 시도했지만 차이점이 없음)을 통해 FileStreamResult을 반환합니다.단위 테스트 FileStreamResult

using (var buffer = new MemoryStream()) 
{ 
    using (var zipStream = new ZipOutputStream(buffer)) 
    { 
     zipStream.PutNextEntry(new ZipEntry("The Simpsons")); 
     var bart = Encoding.UTF8.GetBytes("Homer <3 donuts"); 
     zipStream.Write(bart, 0, bart.Length); 
     zipStream.IsStreamOwner = false;  
     return File(buffer, MediaTypeNames.Application.Zip, fileName); 
    } 
} 

나는 같은 단위 테스트에 이것을 시도하고있다 :

System.ObjectDisposedException : Cannot access a closed Stream. 
    at System.IO.__Error.StreamIsClosed() 
    at System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count) 
    at ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputBuffer.Fill() 
    at ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputBuffer.ReadLeByte() 
    at ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputBuffer.ReadLeInt() 
    at ICSharpCode.SharpZipLib.Zip.ZipInputStream.GetNextEntry() 

내가 직접 브라우저를 통해 다운로드하려고하는 경우는, 500S를 IIS :

var controller = new SimpsonsController(); 
var result = controller.ConfigurationReport(id); 
Assert.IsInstanceOf<FileStreamResult>(result); 

var streamResult = (FileStreamResult) result; 
var zipInputStream = new ZipInputStream(streamResult.FileStream); 

Assert.IsNotNull(zipInputStream); 

var zipEntry = zipInputStream.GetNextEntry(); 
Assert.AreEqual("The Simpsons", zipEntry.Name); 

이제 단위 테스트는 실패 유사한 스택 추적 :

Cannot access a closed Stream. 
System.ObjectDisposedException: Cannot access a closed Stream. 
    at System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count) 
    at System.Web.Mvc.FileStreamResult.WriteFile(HttpResponseBase response) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 

이 종류의 스트림 기반 파일이 컨트롤러를 반환하는지 테스트 한 사람이 있습니까? 어떻게 성공 했니? 수업을 처분하면 안됩니까? 정말?

답변

1

시도해보십시오. 문제는 반환되는 스트림을 삭제하는 것입니다.

public FileStreamResult PDF() 
{ 
    MemoryStream buffer = new MemoryStream(); 
    using (var zipStream = new ZipOutputStream(buffer)) 
    { 
     zipStream.PutNextEntry(new ZipEntry("The Simpsons")); 
     var bart = Encoding.UTF8.GetBytes("Homer <3 donuts"); 
     zipStream.Write(bart, 0, bart.Length); 
     zipStream.IsStreamOwner = false; 
    } 
    return File(buffer, MediaTypeNames.Application.Zip, fileName); 
} 

https://stackoverflow.com/a/10891136/985284을보고 Cheeso의 다른 게시물을 참조하십시오.