2011-12-02 85 views
2

我有一个程序是这样的:单元测试和会话?

public bool IsValidEmployee(string email, string password) 
{ 
    bool valid = false; 
    var employee = dataAccess.GetEmployee(email, password); 

    if(employee! = null) 
    { 
     valid = true; 
     HttpContext.Current.Session["Employee"] = employee; 
    } 

    return valid; 
} 

我的单元测试:

[TestMethod()] 
[HostType("ASP.NET")] 
[AspNetDevelopmentServerHost("C:\Projects", "/")] 
[UrlToTest("http://localhost:59349/")] 
public void GetEmployeeTest() 
{ 
    Domain target = new Domain();   

    var mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.SetupSet(c => c.Session["Employee"] = It.IsAny<object>()); 

    Assert.IsTrue(target.IsValidEmployee("[email protected]", "test");     
} 

的代码失败作为

对象空引用“HttpContext.Current.Session [ “员工”] =员工;'

任何建议如何我可以解决这个错误?

回答

2

我不相信只是嘲笑HttpSession就足以让你的方法中的会话采取嘲弄的行为。您需要一种方法来注入该依赖关系。

您可以重新设计您的函数,将会话对象作为参数。这将使你的方法可测试

例如

public bool IsValidEmployee(string email, string password, HttpSessionStateBase session) 
{ 
    bool valid = false; 
    var employee = dataAccess.GetEmployee(email, password); 

    if(employee! = null) 
    { 
     valid = true; 
     session["Employee"] = employee; 
    } 

    return valid; 
} 

此外,您可以创建一个“SessionManager”,可以impliment ISessionManager会换到会话状态的所有访问,并通过围绕使它更可检验从而将验证雇员的方式和持续会话状态的责任分开。

0

我想你也需要模拟getter是否会...

public void GetEmployeeTest() 
    { 
     Domain target = new Domain(); 
     var mockHttpContext = new Mock<HttpContextBase>(); 
     var mockSession = new Mock<HttpSessionStateBase>(); 
     mockHttpContext.SetupGet(c => c.Session).Returns(mockSession.Object); 
     mockHttpContext.SetupSet(c => c.Session["Employee"] = It.IsAny<object>()); 
     Assert.IsTrue(target.IsValidEmployee("[email protected]", "test")); 
    } 
0

哪些代码失败?这是由于方法中的错误导致的测试失败,还是测试代码本身出现错误?

无论你如何改进你的测试(这可能会听起来有点明显),但我不知道你是否在测试方法的设置线上设置了一个断点,并且确实检查了你正试图分配一个值为null的对象?如果是这种情况,你需要检查你的设置,而其他人可能会说你可能需要嘲笑你的会话,以确保你的测试的设置部分不会失败。

干杯。