How to mock ControllerContext using moq? ERROR mocking ControllerContext

I am using the MOQ Framework, and I have the following Unit test and it does not work with the error message "The object reference is not installed in the object instance" in the line below the code

viewCxt.View.Render(viewCxt, writer); 

Can someone point me in the right direction, please, why does this fail the test?

 [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(); } } 

Here is the 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) 
+7
source share
1 answer

A good way to debug what really needs to be configured in Mock is to create it using the MockBehavior.Strict parameter. Thus,

 var mockHttpContext = new Mock<HttpContextBase>(); 

becomes

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

Then your test will fail with a MockException when you need something from a context that you did not configure. You can return to the Loose option later.

+1
source

All Articles