사용자 정의 ActionResult를 테스트하려고하는데 작동하지 않습니다. 응답 스트림에 파일을 쓰고 있습니다. 따라서 단위 테스트에서 무엇을하고 싶은지 응답을 읽고 올바른지 확인하십시오.유닛 테스트 및 ActionResult
/// <summary>
/// Start writing the file.
/// </summary>
/// <param name="response">The response object.</param>
protected override void WriteFile(HttpResponseBase response)
{
// Convert the IList<T> to a datatable.
dataTable = list.ConvertToDatatable<T>();
// Add the header and the content type required for this view.
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename));
response.ContentType = base.ContentType;
// Gets the current output stream.
var outputStream = response.OutputStream;
// Create a new memorystream.
using (var memoryStream = new MemoryStream())
{
WriteDataTable(memoryStream);
outputStream.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
}
나는 이미 단위 테스트에서 다음을 시도했다 : :
HttpContextBaseMock = new Mock<HttpContextBase>();
HttpRequestMock = new Mock<HttpRequestBase>();
HttpResponseMock = new Mock<HttpResponseBase>();
HttpContextBaseMock.SetupGet(x => x.Request).Returns(HttpRequestMock.Object);
HttpContextBaseMock.SetupGet(x => x.Response).Returns(HttpResponseMock.Object);
var routes = new RouteCollection();
var controller = new CsvActionResultController();
controller.ControllerContext = new ControllerContext(HttpContextBaseMock.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(HttpContextBaseMock.Object, new RouteData()), routes);
var result = controller.ExportToCSV();
그러나, 나는 그것이 작동하지 않는
는 여기에 테스트 할 방법입니다.
이/// <summary>
/// Start writing the file.
/// </summary>
/// <param name="response">The response object.</param>
protected override void WriteFile(HttpResponseBase response)
{
// Add the header and the content type required for this view.
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename));
response.ContentType = base.ContentType;
// Gets the current output stream.
var outputStream = response.OutputStream;
// Create a new memorystream.
using (var memoryStream = new MemoryStream())
{
WriteDataTable(memoryStream);
outputStream.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
}
#endregion Methods
#region Helper Methods
/// <summary>
/// Writes a datatable to a given stream.
/// </summary>
/// <param name="stream">The stream to write to.</param>
private void WriteDataTable(Stream stream)
{
var streamWriter = new StreamWriter(stream, encoding);
// Write the header only if it's indicated to write.
if (includeRowHeader)
{ WriteHeaderLine(streamWriter); }
// Move to the next line.
streamWriter.WriteLine();
WriteDataLines(streamWriter);
streamWriter.Flush();
}
/// <summary>
/// Writes the header to a given stream.
/// </summary>
/// <param name="streamWriter">The stream to write to.</param>
private void WriteHeaderLine(StreamWriter streamWriter)
{
foreach (DataColumn dataColumn in dataTable.Columns)
{
WriteValue(streamWriter, dataColumn.ColumnName);
}
}
/// <summary>
/// Writes the data lines to a given stream.
/// </summary>
/// <param name="streamWriter"><The stream to write to./param>
private void WriteDataLines(StreamWriter streamWriter)
{
// Loop over all the rows.
foreach (DataRow dataRow in dataTable.Rows)
{
// Loop over all the colums and write the value.
foreach (DataColumn dataColumn in dataTable.Columns)
{ WriteValue(streamWriter, dataRow[dataColumn.ColumnName].ToString()); }
streamWriter.WriteLine();
}
}
/// <summary>
/// Write a specific value to a given stream.
/// </summary>
/// <param name="writer">The stream to write to.</param>
/// <param name="value">The value to write.</param>
private void WriteValue(StreamWriter writer, String value)
{
writer.Write(value);
writer.Write(delimeter);
}
사람이 올바른 방향으로 날 포인트 :이 필요한 경우
, 여기에 전체 CsvActionResult의 (생성자없이) 소스입니까? 나는 조롱하는 것을 처음이다. 개인적으로 나는이 길을 갈 것
종류와 관련,
정확한 예외는 무엇입니까? ExportToCSV() 액션은 어떻게 생겼습니까? 어떻게 WriteFile() 메서드를 호출합니까? – Spock
글쎄, ExportToCSV가 "content-dispotion"을 사용하여 응답에 파일을 추가한다고 가정 해 봅시다. 나는 내 작업의 결과가 기록되는 전체 응답 스트림을 얻을 전체 응답 스트림 (그것에서 모든 속성)을 확인하기 위해 나에게 단위 테스트를하고 싶습니다. 그러나 나는 그것이 작동하도록하지 않습니다. 예 : Response.OutputStream은 항상 null입니다. Response.ContentStream은 null입니다. 내가 예를 들어 파일 이름, 콘텐츠 유형을 확인하고 싶은 , ... 종류의 안부 – Complexity