Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用moq模拟ControllerContext?模拟ControllerContext时出错_C#_.net_Asp.net Mvc_Unit Testing_Moq - Fatal编程技术网

C# 如何使用moq模拟ControllerContext?模拟ControllerContext时出错

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

我使用的是MOQ框架,我进行了以下单元测试,它失败了,代码下面一行出现了错误消息“Object reference not set to a instance of a Object”

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);