我有一个方法:
public DataSet someMethod()
{
List a = someObj.getList(name, integerId);
}
现在,integerId是通过HttpContext.Current.Session
变量获取的。
我已经为该方法编写了单元测试。但由于测试在 Web 进程之外运行,HttpContext.Current.Session
返回 null 并且测试失败。
有什么解决办法吗?
最佳答案
首先你必须初始化HttpContext.Current
:
HttpContext.Current = new HttpContext(new HttpRequest("", "http://blabla.com", "") {},
new HttpResponse(new StringWriter()));
然后你必须设置 session :(Necroskillz 已在 his blog 中解释了执行此操作的方法)
public static void SetFakeSession(this HttpContext httpContext)
{
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 });
}
以下代码片段展示了它的工作原理:
[TestMethod]
public void TestMethod1()
{
HttpContext.Current = new HttpContext(new HttpRequest("", "http://blabla.com", "") {},
new HttpResponse(new StringWriter()));
HttpContext.Current.SetFakeSession();
HttpContext.Current.Session["foo"] = 1;
Assert.AreEqual(1, HttpContext.Current.Session["foo"]);
}
关于c# - 在旧版 ASP.NET 应用程序中进行单元测试以模拟 HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907082/