【发布时间】:2014-01-31 21:28:09
【问题描述】:
我正在尝试对我的控制器的注销操作进行单元测试。我的控制器接收到一个处理会话变量的接口:
public HomeController(IUnitOfWork unitOfWork, ISecurityService security = null)
{
_unitOfWork = unitOfWork;
if (security != null)
{
_securityService = security;
}
else
{
_userService = new UserService(_unitOfWork)
_securityService = new SecurityService(_userService);
}
}
使用 Moq,我创建了一个 HttpSessionStateBase 对象 我用它在我的单元测试类中创建一个 SecurityService 对象:
var mockSession = new Mock<HttpSessionStateBase>();
mockSession.SetupGet(s => s["UserID"]).Returns("1");
HttpSessionStateBase session = mockSession.Object;
ISecurityService _securityService = new SecurityService(_userService, session);
我的安全服务
public class SecurityService : ISecurityService
{
private readonly IUsuarioService _userService ;
private readonly HttpSessionStateBase _session;
public int UserID
{
get { return Convert.ToInt32(_session["UserID"]); }
set { _session["UserID"] = value; }
}
public SecurityService(IUserService service, HttpSessionStateBase session = null)
{
_userService = service;
_session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session);
}
public void Logout()
{
// I'm trying to delete this variable, but I can't
_session["UserID"] = 0;
_session.Clear();
_session.Abandon();
}
}
最后,我的测试方法
[TestMethod]
public void Should_delete_session_variable_from_the_user()
{
controller.Logout();
// It's allways 1
Assert.IsTrue(Convert.ToInt32(session["UserID"]) == 0);
}
当我调试这段代码时,我可以看到会话变量没有改变它的值。但是,如果我打开一个“快速观察”窗口并执行_session["UserID"] = 0;,它的值就会改变。
我不明白为什么。这是我第一次看到一个变量在调试时不会改变它的值。
【问题讨论】:
标签: asp.net-mvc unit-testing session moq