新しい 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 は失敗します)