Asp.net mvc 在MVC单元测试中填充HTTPContext.Item

Asp.net mvc 在MVC单元测试中填充HTTPContext.Item,asp.net-mvc,mocking,httpcontext,Asp.net Mvc,Mocking,Httpcontext,在MVC控制器的一个函数中,我们有以下几行代码 public ActionResult EditEmp(int eId = 0) { EPermission ePermission = (EPermission)HttpContext.Items["empPermission"]; } 在我的单元测试中,我调用此控制器进行测试 public void TestMethod1() { var result = eController.EditEmp(10) as ViewResu

在MVC控制器的一个函数中,我们有以下几行代码

public ActionResult EditEmp(int eId = 0)
{
    EPermission ePermission =  (EPermission)HttpContext.Items["empPermission"];
}
在我的单元测试中,我调用此控制器进行测试

public void TestMethod1()
{
   var result = eController.EditEmp(10) as ViewResult;
}
我的测试用例失败,因为在运行时,
HttpContext
中没有
empPermission
的值


我们想知道如何用一个值填充
HttpContext.Items
,以便它可以在运行时拾取。我们已经在mock中查找了一些示例,但到目前为止还没有找到任何运气。

您需要模拟HttpContext。下面是在调用控制器方法之前应在单元测试(最好在TestInitialize上)中运行的代码示例:

    var httpRequest = new HttpRequest("", "http://mySomething/", "");
    var stringWriter = new StringWriter();
    var httpResponce = new HttpResponse(stringWriter);
    var httpContext = new HttpContext(httpRequest, httpResponce);

    var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
                                                         new HttpStaticObjectsCollection(), 10, true,
                                                         HttpCookieMode.AutoDetect,
                                                         SessionStateMode.InProc, false);

    httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
                                             BindingFlags.NonPublic | BindingFlags.Instance,
                                             null, CallingConventions.Standard,
                                             new[] { typeof(HttpSessionStateContainer) },
                                             null)
                                        .Invoke(new object[] { sessionContainer });

    HttpContext.Current = httpContext;

    HttpContext.Current.User = new GenericPrincipal(
        new GenericIdentity("WSUSER"),
        new string[0]

可能重复的

此问题不完整,无法编译。提供一个可用于重现问题的。也许那时可以提供更好的帮助。可能的副本