在创建单元测试时,有没有办法模拟/伪造 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/