2011-12-02 103 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的對象?如果是這種情況,你需要檢查你的設置,而其他人可能會說你可能需要嘲笑你的會話,以確保你的測試的設置部分不會失敗。

乾杯。