Asp.net mvc 3 如何为HttpContext.Current.Request.Headers编写单元测试

Asp.net mvc 3 如何为HttpContext.Current.Request.Headers编写单元测试,asp.net-mvc-3,moq,vs-unit-testing-framework,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) {

下面是一个例子

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"]);
        }
    }
}

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

哦,单元测试
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);

谢谢达林的快速回复。通知它。无法解决问题(“ID”)。FirstOrDefault不起作用。表示不包含定义:(很难说你做错了什么。这对我来说非常好。@DarinDimitrov可以使用HttpContext进行单元测试,只需设置HttpContext.Current=new HttpContext(new HttpRequest(“,”,”),new HttpResponse(new StringWriter());您可以从代码中获得它。(你的回答是正确的,只是想澄清一下这是可能的,有时是有用的)