如何为HttpContext.Current.Request.Headers编写单元测试

时间:2015-12-28 17:21:39

标签: asp.net-mvc-3 moq vs-unit-testing-framework

以下是一个例子。

public class MyController : Controller
{
    [Route("~/api/mycontroller")]
    [HttpGet]
    public int ID()
    {
        try
        {
            return somecontroller.getID(ID);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

在其上方是从下面的控制器获取ID的控制器。 下面是它继承的控制器。

public class Controller : ApiController
{
    public int ID
    {
        get
        {
            return int.Parse(HttpContext.Current.Request.Headers["ID"]);
        }
    }
}

如何为以下内容编写单元测试用例。???

1 个答案:

答案 0 :(得分:1)

哦,单元测试HttpContext.Current。这是我的最爱之一: - )

您不能为依赖HttpContext.Current的内容编写单元测试。因此,如果您要编写可测试代码,则第一步是在整个解决方案中搜索HttpContext.Current关键字,然后将其从存在中删除。

在这种特殊情况下,您当然会用相应的抽象替换它们:

public class Controller : ApiController
{
    public int ID
    {
        get
        {
            return int.Parse(Request.Headers.GetValues("ID").FirstOrDefault());
        }
    }
}

现在正确地对Web API控制器进行单元测试非常简单:

// arrange
var sut = new MyController();
sut.Request = new HttpRequestMessage();
sut.Request.Headers.TryAddWithoutValidation("ID", "5");


// act
var actual = sut.SomeControllerAction();

// assert
Assert.AreEqual(5, actual);