我的Web API项目中有一个方法,因为它非常简单,没有注入依赖项,它处理一个具体的POST对象,我不知道如何创建一个单元测试为了它。以下代码的设计中是否有任何内容我可以更改以使其更适合测试?
public class HomeController : ApiController
{
public HttpResponseMessage Post(RootObject root)
{
HttpResponseMessage httpResponse;
return TryCreateResponse(root, out httpResponse) ? httpResponse : Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "An unhandled exception occurred on the server.");
}
private bool TryCreateResponse(RootObject root, out HttpResponseMessage httpResponse)
{
var success = false;
httpResponse = null;
try
{
var creator = (ModelState.IsValid)?
new OkResponseCreator(root) as IHttpResponseCreator:
new BadReqeuestResponseCreator(ApplicationSettings.HttpBadRequestErrorMessage);
var abstractHttpResponse = new ResponseContext(creator).CreateHttpResponse();
httpResponse = Request.CreateResponse(abstractHttpResponse.StatusCode, abstractHttpResponse);
success = true;
}
catch
{
success = false;
}
return success;
}
}
答案 0 :(得分:0)
首先使用假HomeController.Post
对RootObject
进行测试,并使用测试中实际返回的内容断言您的预期结果。
虽然没有注入依赖项,但该方法和扩展类依赖于OkResponseCreator
,BadReqeuestResponseCreator
ResponseContext
和ApplicationSettings
。
鉴于这些类的耦合程度在您的示例中并不完全明显,以及它们的依赖性是什么,我建议您先从查看这些类开始。
如果您的初始测试失败,您可以尝试重构和重新测试的循环,因为您可以将提到的类设置为可模拟的,以便可以将它们安全地注入控制器以获得更好的可测试性。