如何在.NET Core上使用Moq模拟多部分/表单数据请求?

时间:2019-06-21 11:37:13

标签: testing asp.net-core mocking moq multipartform-data

我有一个用于Blob存储的.NET Core类库,我在ASP.NET Core Web应用程序中使用了该库,并且我想测试它公开的控制器。由于无法控制的原因,我需要在不使用HTTP客户端,测试服务器或Web应用程序的情况下测试控制器,这就是我尝试模拟请求的原因。我需要模拟文件上传的multipart / form-data HTTP请求,以测试控制器的POST方法。

我试图弄清楚如何模拟本文中的请求:How to mock the Request on Controller in ASP.Net MVC?,但无济于事。

// Controller action
[HttpPost]
[DisableFormValueModelBinding]
public async Task<AttachedFile> Post()
{
    return await Request.WriteToFileStorage(service);
}
// Test with mocking
[Fact]
public async Task Post_New()
{
    // ...
    var controller = new FileStorageController(service);
    var content = Convert.FromBase64String(imageBase64);
    var request = new Mock<HttpRequest>();
    request.SetupGet(x => x.Headers).Returns(
        new HeaderDictionary { { "X-Requested-With", "XMLHttpRequest" } });
    request.SetupGet(x => x.ContentLength).Returns(1455);
    request.SetupGet(x => x.ContentType).Returns("multipart/form-data");
    request.SetupGet(x => x.Body).Returns(new MemoryStream(content));
    var httpContext = new Mock<HttpContext>();
    httpContext.SetupGet(x => x.Request).Returns(request.Object);
    controller.ControllerContext = new ControllerContext {
        HttpContext = httpContext.Object
    };

    var result = await controller.Post();
    // ...
}

当我尝试以某种方式模拟Request对象时,测试失败,并且在测试资源管理器中收到一个异常,消息为:“消息:System.IO.InvalidDataException:缺少内容类型边界”。如何正确形成请求的正文?

0 个答案:

没有答案