2013-03-11 3 views
3

일부 단위 테스트를 실행하기 위해 세션 변수를 설정하는 데 실패했습니다. 세션 변수를 설정하려고하면 "System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다."오류가 계속 발생합니다. 여기 세션 변수를 설정할 수 없습니다.

내가 짓고 있어요 테스트입니다 :

[TestMethod] 
public void MyMethod() 
{ 
    //Arrange 
    int id = 12345; 
    string action = "A"; 
    string comment = ""; 
    string user = "user"; 
    var controller = new MyController(); 

    //Act 
    controller.Session["altUser"] = user; 
    var result = controller.Process(id, action, comment); 

    //Assert 
    Assert.IsNotNull(result);  
} 

그리고 여기 내 컨트롤러 : 나는 응용 프로그램 자체를 실행할 때 오류 및 응용 프로그램 기능이없는, 그러나

[Authorize] 
public class MyController : Controller 
{ 
    public ActionResult Process(int id, string action, string comment) 
    { 
    string userId = Session["altUser"].ToString(); 
    //some other stuff that evaluates ID, Action, and Comment 
    } 
} 

그것은해야한다. 테스트 주도 개발을 사용하면 테스트를 통해 구현 방법을 알 수 있습니다. 이미 수행 된 응용 프로그램에 대해 Unit Testing을 사용하여 연습을하려고합니다. 가능하면 응용 프로그램이 작동하기 때문에 구현에 대한 변경을 피하고 이미 알고있는 것을 지원하는 단위 테스트를 작성하고 싶습니다.

답변

7

컨트롤러가 유닛 테스트에 존재하지 않는 HttpContext에서 세션을 가져옵니다. 이것이 실패합니다.

그러나 HttpContext을 조롱하고 모의 세션을 설정할 수도 있습니다. 이 작업을 할 수처럼

뭔가 당신은 분명히 당신이 실제로 나가 할 사항에 대한 자세한 내용은 mock 객체를 작성해야합니다

var mockControllerContext = new Mock<ControllerContext>(); 
    var mockSession = new Mock<HttpSessionStateBase>(); 
    mockSession.SetupGet(s => s["altUser"]).Returns("user"); 
    mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object); 

    var controller = new MyController(); 
    controller.ControllerContext = mockControllerContext.Object; 

(조롱 프레임 워크로 MOQ를 사용).

HttpSessionStateBaseHttpContextBase에서 고유 한 클래스를 파생하고 실제 세션 대신 사용할 수 있습니다.

+0

이와 같은 mocking 프레임 워크를 사용할 때 Arrange, Act, Assert 패턴을 따라갈 수 있습니까? (Moq를 사용하면 Setup, Methods, Verify) '스테이지 제목'처럼 보이거나 최상의 것입니다. 다른 패턴을 따르는 연습? 그들이 가지고있는 QuickStart 튜토리얼을 통해 얻으려는 동안이 질문을합니다. –

+0

AAA는 괜찮습니다. - 대부분의 테스트가 설정되는 방식입니다. –

+0

고마워, 많이 도와 줬어! – Rovdjuret

0

단위 테스트를 실행하면 웹 서버를 통해 프로그램이 실행되지 않으므로 HttpContext 또는 ASP.NET 세션에 대한 액세스 권한이없는 반면 VS에서 디버그를 통해 프로그램을 실행할 때, 프로그램이 세션을 사용할 수있게 해주는 Visual Studio 웹 서버에 내장되어 있습니다.

Here은 ASP.NET 세션과 작동 방법을 안내하는 기사입니다.

+0

그 기사는 세션에 대한 나의 이해를 확실히 깊게합니다. 나는 편의상 응용 프로그램에서 사용하는 것이고 일은 잘되어 가고 있습니다. 감사! –

2

세션이 없습니다. ASP.NET 테스트는 초기화되지 않았으며 단위 테스트를 실행할 때 실행되지 않습니다. 코드 외부에있는 Session 종속성을 분해하고 ASP.NET의 런타임 기능과 독립적 인 단위 테스트에 필요한 클래스와 메서드를 만들어야합니다.

+0

이 조언은 저에게 도움이되었습니다. 세션 변수를 저장하고 해당 필드를 참조하는 코드를 업데이트 한 다음 생성자에서 초기화하기 위해 컨트롤러에서 필드를 만들었습니다. 그런 다음 단위 테스트를 할 때 컨트롤러를 인스턴스화 할 때 필드를 명시 적으로 설정할 수 있습니다. :) –

관련 문제