c# - 在旧版 ASP.NET 应用程序中进行单元测试以模拟 HttpContext

标签 c# asp.net unit-testing httpcontext

我有一个方法:

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/

相关文章:

c# - 为 Compact Framework 和 Full Framework 设计数据访问

c# - 是否可以创建通用 API GET 操作?

c# - 正则表达式与字符串不匹配

javascript - Sails.js:如何实际运行测试

php - CakePHP 3 : Unable to insert fixtures when running phpunit

python - 如何在 Python 中生成动态(参数化)单元测试?

c# - Convert.ChangeType 从 int 到 bool

c# - MVC Razor 和 AJAX 分页

c# - Web 窗体对象引用未设置为对象的实例

c# - 未在 asp 按钮和 Bootstrap 下拉菜单中设置按钮对齐方式