2013-07-09 2 views
3

Я использую MVC3 и хочу проверить следующее действие с помощью Microsoft.VisualStudio.TestTools.UnitTesting и Moq:тест блока не удается из-за Sessions

public ActionResult index() 
{ 
     Session.Add("username", "Simon"); 
     var lName = Session["username"] as String; 
     var lSessionID = Session.SessionID; 
     return Content(lSessionID); 
} 

Моего блока тест:

[TestMethod] 
public void IndexTest() 
{ 

    // Arrange 

    var contextMock = new Mock<ControllerContext>(); 
    var mockHttpContext = new Mock<HttpContextBase>(); 

    var session = new Mock<HttpSessionStateBase>(); 
    mockHttpContext.Setup(ctx => ctx.Session).Returns(session.Object); 

    StartController controller = new StartController(); 

    var lResult = controller.index() as ContentResult; 

    Assert......; 
} 

Моих результатов модульного тестирования в NullReferenceException :

enter image description here

Я также пробовал MvcContrib.TestHelper, который не работает Session.SessionID с сообщением «еще не реализовано».

Как я могу проверить свое действие с модульными тестами?

ответ

9

Ваша ложная установка неполна.

Вам нужно настроить ControllerContextc.HttpContext вернуть mockHttpContext и вы также должны использовать contextMock в вашем StartController с установкой его ControllerContext свойства:

Так следующие установки должны работать:

var contextMock = new Mock<ControllerContext>(); 
var mockHttpContext = new Mock<HttpContextBase>(); 
var session = new Mock<HttpSessionStateBase>(); 

mockHttpContext.Setup(ctx => ctx.Session).Returns(session.Object); 
contextMock.Setup(ctx => ctx.HttpContext).Returns(mockHttpContext.Object); 

StartController controller = new StartController(); 
controller.ControllerContext = contextMock.Object; 
+1

Спасибо для вашего быстрого совета. Вы освободили меня от моей боли. – Simon