【问题标题】:ASP.NET MVC: Unit testing session variables does't changeASP.NET MVC:单元测试会话变量不会改变
【发布时间】: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


    【解决方案1】:

    终于找到了,解决方法是添加一个SetupSet方法。
    这是最终代码:

    int sessionValue = 0;
    var mockSession = new Mock<HttpSessionStateBase>();
    mockSession.SetupSet(s => s["UserId"] = It.IsAny<int>())
        .Callback((string name, object val) => sessionValue = (int) val);
    mockSession.SetupGet(s => s["UserId"]).Returns(() => sessionValue);
    

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2015-03-11
      相关资源
      最近更新 更多