4

次のような 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: 1 つ以上のエラーが発生しました。---> System.IO.IOException: MIME マルチパート ストリームの予期しない終了。MIME マルチパート メッセージが不完全です。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 結果)

これを行う最善の方法は何ですか?

4

1 に答える 1

11

質問は少し前に投稿されましたが、同じ種類の問題に対処する必要がありました。

これが私の解決策でした:

MultipartFormDataContent を HttpRequestMessage に追加する 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);
    }
于 2015-01-15T10:07:57.567 に答える