2011-12-02 4 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");     
} 

코드가 실패

객체 Null 참조 '로 HttpContext.Current.Session [ "Employee"] = employee; '

이 오류를 해결할 수있는 방법은 무엇입니까?

답변

2

난 그냥의 HttpSession을 조롱하는 것은 조롱 행동을하는 당신의 방법에 세션을 얻기에 충분하다 생각하지 않는다. 그 의존성을 주입 할 방법이 필요합니다.

당신은 PARAM로 세션 객체에 적용하려면 기능을 재 설계 할 수있다. 이

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; 
} 

는 또한 세션 상태에 대한 모든 액세스를 포장하고, 따라서 훨씬 더 검증하고 그 주위에 전달할 것 ISessionManager을 impliment 수있는 "SessionManager에"를 만들 수

예를 들어

당신의 방법을 검증 할 것 세션 상태를 유지하는 방법과 장소의 책임을 직원 유효성 검사에서 분리합니다. 난 당신이 또한 세션 게터을 조롱 할 필요가 있다고 생각

0

...

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입니까? 이 경우에는 설정을 확인해야하며 다른 사람들은 테스트 설정 부분이 실패하지 않도록 세션을 조롱해야한다고 말했을 수도 있습니다.

건배.