我有一个用于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:缺少内容类型边界”。如何正确形成请求的正文?