【问题标题】:How to write unit test for HttpContext.Current.Request.Headers如何为 HttpContext.Current.Request.Headers 编写单元测试
【发布时间】:2016-04-02 13:24:18
【问题描述】:

下面是一个例子。

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

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 感谢达林的快速回复。应用它。不能解决问题(“ID”)。FirstOrDefault 不起作用。说不包含定义。 :(
    • 好吧,很难说你做错了什么。这对我来说非常好。
    • @DarinDimitrov 可以使用 HttpContext 进行单元测试,只需设置 HttpContext.Current = new HttpContext(new HttpRequest("", "example.com", ""), new HttpResponse(new StringWriter( )));你可以从代码中得到它。(你的答案是正确的,只是想澄清它是可能的,有时是有用的)
    猜你喜欢
    • 2018-01-17
    • 2012-01-06
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多