2011-06-09 9 views
7

Estoy utilizando el Marco de MOQ y tengo la siguiente prueba de la unidad y que está fallando con el siguiente mensaje de error “Referencia a objeto no establecida como instancia de un objeto” en la línea de abajo del código¿Cómo burlarse del ControllerContext usando moq? Error al burlarse del ControllerContext

viewCxt.View.Render(viewCxt, writer); 

¿Alguien podría indicarme en la dirección correcta por qué esto no está pasando la prueba?

[Test] 
public void can_call_PopulateBankTransactionWorkQueueViewInTransactionMetaDataAjaxResponseObject() 
{ 

    var transactionMetaData = new TransactionMetaDataDTO() { TransactionId = "1", FileId = "1", LockboxNumber = "0402020", DepositDate = "04.26.2011", BatchId = "1" }; 


    var request = new Mock<HttpRequestBase>(); 
    request.Setup(r => r.HttpMethod).Returns("GET"); 
    var mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.Setup(c => c.Request).Returns(request.Object); 

    var controllerContext = new ControllerContext(mockHttpContext.Object, new Mock<RouteData>().Object, new Mock<ControllerBase>().Object); 

    var checkWorkQueueController = new CheckWorkQueueController(
      activeDirectorySecurityManager.Object, businessObjectAdapter, httpRequestObjectHelper.Object, invoiceRepos.Object, new HtmlHelpers()); 

    checkWorkQueueController.ControllerContext = controllerContext; 
    Assert.DoesNotThrow(() => checkWorkQueueController.PopulateBatchTreeSelectorViewInTransactionMetaDataAjaxResponseObject(transactionMetaData)); 
} 

internal void PopulateBatchTreeSelectorViewInTransactionMetaDataAjaxResponseObject(TransactionMetaDataDTO transactionMetaDataDTO) 
{ 

    var checkWorkQueueViewModel = new CheckWorkQueueViewModel(securityManager, businessObjectAdapter); 
    SetActiveFileAndLockbox(transactionMetaDataDTO, checkWorkQueueViewModel, transactionMetaDataDTO.FileId, transactionMetaDataDTO.LockboxNumber); 
    transactionMetaDataDTO.BatchTreeSelectorView = htmlHelpers.RenderViewToString(ApplicationConstants.CheckWorkQueueViewPath + ApplicationConstants.BatchTreeSelectorViewFileName, this, checkWorkQueueViewModel); 
} 

public string RenderViewToString<T>(string viewPath, ControllerBase controller, T model) 
{ 
     controller.ViewData.Model = model; 
     using (var writer = new StringWriter()) 
     { 
      var view = new WebFormView(viewPath); 
      var vdd = new ViewDataDictionary<T>(model); 
      var viewCxt = new ViewContext(controller.ControllerContext, view, vdd, new TempDataDictionary(), writer); 
      viewCxt.View.Render(viewCxt, writer); //ERROR throwing here 
      return writer.ToString(); 
     } 
} 

Aquí es el StackTrace:

at System.Web.VirtualPath.GetCacheKey() 
at System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) 
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp) 
at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) 
at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(String virtualPath, Type requiredBaseType) 
at System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.CreateInstanceFromVirtualPath(String virtualPath, Type requiredBaseType) 
at System.Web.Mvc.WebFormView.Render(ViewContext viewContext, TextWriter writer) 

Respuesta

1

una buena forma de depurar lo que realmente tiene que ser configurado en el Mock es crear con la opción MockBehavior.Strict. Así,

var mockHttpContext = new Mock<HttpContextBase>(); 

convierte

var mockHttpContext = new Mock<HttpContextBase>(MockBehavior.Strict); 

Entonces, la prueba se producirá un error con un MockException cuando se requiere algo del contexto en el que no se ha establecido. Puede volver a la opción Suelto más tarde.

+0

Desafortunadamente, este error no es producido por ningún objeto simulado estándar. – iGanja

Cuestiones relacionadas