asp.net - 如何模拟/伪造 ASP.Net Web 表单中的 session 对象?

标签 asp.net session webforms tdd mocking

在创建单元测试时,有没有办法模拟/伪造 ASP.Net Web 表单中的 session 对象?

我当前正在将用户详细信息存储在由我的业务逻辑访问的 session 变量中。

当单独测试我的业务逻辑时, session 不可用。这似乎表明设计很糟糕(尽管我不确定)。业务逻辑层是否应该首先访问 session 变量?

如果是这样,那么我将如何用假对象交换用户详细信息以进行测试?

最佳答案

您只需 4 行代码即可完成此操作。尽管这并不涉及之前将 session 移出业务逻辑层的评论,但有时如果您正在使用与 session 高度耦合的遗留代码(我的场景),那么有时您可能需要执行此操作。

命名空间:

using System.Web;
using System.IO;
using System.Web.Hosting;
using System.Web.SessionState;

代码:

HttpWorkerRequest _wr = new SimpleWorkerRequest(
    "/dummyWorkerRequest", @"c:\inetpub\wwwroot\dummy",
    "default.aspx", null, new StringWriter());

HttpContext.Current = new HttpContext(_wr);

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

SessionStateUtility.AddHttpSessionStateToContext(
    HttpContext.Current, sessionContainer);

然后您可以引用 session 而不会出现 NullReferenceException 错误:

HttpContext.Current.Session.Add("mySessionKey", 1);

这是我从以下文章中编译的代码组合:

关于asp.net - 如何模拟/伪造 ASP.Net Web 表单中的 session 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981426/

相关文章:

javascript - 提交后清空textarea的内容

jquery 对话框在更新面板中打开多个实例并且触发过滤器事件

asp.net - 具有 2 个不同域的 mvc3 路由

asp.net(带有 VB.Net 的 Web 表单)连接到 SQL 数据库

Designer.cs 文件中的 ASP.NET 用户控件声明

php - 我应该调用一个包含 SESSION 值的变量而不是在 PHP 中调用实际 session 吗?

c# - 如何在 ASP.NET 中使用登录系统上传特定文件夹?

python - Flask session 注销并重定向到登录页面

c# - 从后面的 ASP 代码将参数传递给 Javascript 函数

c# - Webforms : 404 error not catched if url has no .aspx extension