【发布时间】:2012-11-13 00:41:16
【问题描述】:
我正在使用新的 ASP.NET WebAPI 的项目中工作。我目前的任务是接受上传的文件。到目前为止,我已经使用 TDD 来驱动 WebAPI 代码,但是我在上传时遇到了麻烦。我目前正在遵循http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2 的建议,但似乎根本无法将其排除在单元测试之外。为了获取文件和表单数据,我必须使用MultipartFormDataStreamProvider,这是无法模拟和/或覆盖的。如果没有放弃我的 TDD 方法,我该怎么办?
这是示例中的代码:
public Task<HttpResponseMessage> PostFormData()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
// Read the form data and return an async task.
var task = Request.Content.ReadAsMultipartAsync(provider).
ContinueWith<HttpResponseMessage>(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
}
// This illustrates how to get the file names.
foreach (MultipartFileData file in provider.FileData)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine("Server file path: " + file.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK);
});
return task;
}
第一个问题是这一行:
var provider = new MultipartFormDataStreamProvider(root);
对于初学者,要对这段代码进行单元测试,我需要能够注入这样的提供程序。在那个简单的构造函数调用中,它确实太多了,以至于“更新它”。一定有别的办法。 (如果不是,WebAPI 失败)
【问题讨论】:
-
你能提供一些你正在使用的代码吗?顺便说一句,没有什么是不可能的..
-
您要测试上传过程的哪一部分?控制器?还是保存文件的代码?
-
@Matt Phillips,我想分别测试两者。我将我可以提取的内容提取到 UploadHandler 类中,但流提供程序是一个大问题。
-
可以在这里找到更新的、直接的答案:stackoverflow.com/a/27961019/264628
标签: c# file-upload tdd asp.net-web-api