C# 如何使用moq模拟ControllerContext?模拟ControllerContext时出错
我使用的是MOQ框架,我进行了以下单元测试,它失败了,代码下面一行出现了错误消息“Object reference not set to a instance of a Object”C# 如何使用moq模拟ControllerContext?模拟ControllerContext时出错,c#,.net,asp.net-mvc,unit-testing,moq,C#,.net,Asp.net Mvc,Unit Testing,Moq,我使用的是MOQ框架,我进行了以下单元测试,它失败了,代码下面一行出现了错误消息“Object reference not set to a instance of a Object” viewCxt.View.Render(viewCxt, writer); 有谁能告诉我为什么这个考试不及格吗 [Test] public void can_call_PopulateBankTransactionWorkQueueViewInTransactionMetaDataAjaxResponseO
viewCxt.View.Render(viewCxt, writer);
有谁能告诉我为什么这个考试不及格吗
[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();
}
}
调试实际需要在Mock上设置的内容的一个好方法是使用MockBehavior.Strict选项创建它。所以
var mockHttpContext = new Mock<HttpContextBase>();
var mockHttpContext=new Mock();
变成
var mockHttpContext = new Mock<HttpContextBase>(MockBehavior.Strict);
var mockHttpContext=newmock(MockBehavior.Strict);
然后,当测试需要来自您尚未设置的上下文的内容时,您的测试将失败并出现MockException。您可以稍后恢复到松散选项。不幸的是,任何标准模拟对象都不会产生此错误。
var mockHttpContext = new Mock<HttpContextBase>(MockBehavior.Strict);