在单元测试中创建 mulitpart/mixed 表单请求
Creating a mulitpart/mixed form request in unit test
我正在开发 Web API 端点,它将接受 multipart/mixed 消息作为 POST。我面临的问题是如何在单元测试中模拟这样的请求?
API方法的核心是:
public HttpResponseMessage Post(){
var parsedContent=Request.Content.ReadAsMultipartAsync().Result;
foreach(var item in parsedContent.Contents) {
switch(item.Headers.ContentType.MediaType){
case "application/json":
doSomething(item);
break;
case "text/plain":
doSomethingElse(item);
break;
case "application/pdf":
doAnotherThing(item);
break;
case "image/png":
doYetAnotherThing(item);
break;
}
}
//return status message based on results of previous calls...
}
我知道在我的测试中调用 post 之前,我必须创建请求对象并将我的测试条件播种到它和控制器中。我在整理时遇到的问题是将多部分内容转换为 ReadAsMultipartAsync()
调用的正确形式的正确方法。
我将这个方法拼凑在一起,它创建的请求在被送入上述控制器时被正确接受和解析。但是,设置断点和检查请求对象在通过此测试构建时与通过 fiddler 之类的东西生成并通过管道进入时看起来非常不同。管道包含 System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent
类型的内容,而测试调试是 System.Net.Http.MultipartContent
.
public static HttpRequestMessage CreateMixedPostRequest(string url, IEnumerable<HttpContent> contentItems) {
var request=new HttpRequestMessage(HttpMethod.Post, url);
var content=new MultipartContent("mixed");
foreach(var item in contentItems) {
content.Add(item);
}
request.Content=content;
return request;
}
我想我担心这种技术会导致错误的安全感,因为测试不会以与管道上线时相同的格式向控制器提供内容。有没有更好的方法来为我的测试构建请求?还是我太偏执了,这对我的场景来说是一个可行的选择吗?
编辑:
我们已经到了尝试从外部代码测试此端点的地步,并且我们看到 LazyStream 和 Multipart 之间存在显着的性能差异。提交与内部测试相同的数据时,外部代码通常会超时。
单元测试的目的是确保一旦您收到数据,您的代码就会正确运行。您可以安全地假设管道将正常工作,前提是您了解管道的工作原理。我会继续按照您设计的方式进行单元测试,然后进行一些实时集成测试以确保管道按预期工作。集成测试可以 运行 作为验证测试套件的一部分,不一定 运行 每个构建,因为它只是确认您对管道功能的假设。
我正在开发 Web API 端点,它将接受 multipart/mixed 消息作为 POST。我面临的问题是如何在单元测试中模拟这样的请求?
API方法的核心是:
public HttpResponseMessage Post(){
var parsedContent=Request.Content.ReadAsMultipartAsync().Result;
foreach(var item in parsedContent.Contents) {
switch(item.Headers.ContentType.MediaType){
case "application/json":
doSomething(item);
break;
case "text/plain":
doSomethingElse(item);
break;
case "application/pdf":
doAnotherThing(item);
break;
case "image/png":
doYetAnotherThing(item);
break;
}
}
//return status message based on results of previous calls...
}
我知道在我的测试中调用 post 之前,我必须创建请求对象并将我的测试条件播种到它和控制器中。我在整理时遇到的问题是将多部分内容转换为 ReadAsMultipartAsync()
调用的正确形式的正确方法。
我将这个方法拼凑在一起,它创建的请求在被送入上述控制器时被正确接受和解析。但是,设置断点和检查请求对象在通过此测试构建时与通过 fiddler 之类的东西生成并通过管道进入时看起来非常不同。管道包含 System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent
类型的内容,而测试调试是 System.Net.Http.MultipartContent
.
public static HttpRequestMessage CreateMixedPostRequest(string url, IEnumerable<HttpContent> contentItems) {
var request=new HttpRequestMessage(HttpMethod.Post, url);
var content=new MultipartContent("mixed");
foreach(var item in contentItems) {
content.Add(item);
}
request.Content=content;
return request;
}
我想我担心这种技术会导致错误的安全感,因为测试不会以与管道上线时相同的格式向控制器提供内容。有没有更好的方法来为我的测试构建请求?还是我太偏执了,这对我的场景来说是一个可行的选择吗?
编辑: 我们已经到了尝试从外部代码测试此端点的地步,并且我们看到 LazyStream 和 Multipart 之间存在显着的性能差异。提交与内部测试相同的数据时,外部代码通常会超时。
单元测试的目的是确保一旦您收到数据,您的代码就会正确运行。您可以安全地假设管道将正常工作,前提是您了解管道的工作原理。我会继续按照您设计的方式进行单元测试,然后进行一些实时集成测试以确保管道按预期工作。集成测试可以 运行 作为验证测试套件的一部分,不一定 运行 每个构建,因为它只是确认您对管道功能的假设。