没有任何注入依赖项的Web API方法的单元测试

时间:2016-06-02 00:41:17

标签: c# unit-testing asp.net-web-api

我的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;
    }
}

1 个答案:

答案 0 :(得分:0)

首先使用假HomeController.PostRootObject进行测试,并使用测试中实际返回的内容断言您的预期结果。

虽然没有注入依赖项,但该方法和扩展类依赖于OkResponseCreatorBadReqeuestResponseCreator ResponseContextApplicationSettings

鉴于这些类的耦合程度在您的示例中并不完全明显,以及它们的依赖性是什么,我建议您先从查看这些类开始。

如果您的初始测试失败,您可以尝试重构和重新测试的循环,因为您可以将提到的类设置为可模拟的,以便可以将它们安全地注入控制器以获得更好的可测试性。