ASP.NET MVC - 使用Moq框架进行RenderPartialViewToString()单元测试?

6
我正在使用这个帮助方法将我的PartialViewResult转换为字符串,并将其作为Json返回 - http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/ 我的问题是,我正在使用Moq来模拟控制器,每当我运行使用RenderPartialViewToString()方法的单元测试时,我会在ControllerContext上得到“对象引用未设置为对象的实例”的错误。
private ProgramsController GetController()
{
var mockHttpContext = new Mock<ControllerContext>();
mockHttpContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("test");
mockHttpContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
// Mock Repositories
var mockOrganizationRepository = new MockOrganizationRepository(MockData.MockOrganizationsData());
var mockIRenderPartial = new BaseController();
var controller = new ProgramsController(mockOrganizationRepository, mockIRenderPartial);
controller.ControllerContext = mockHttpContext.Object;
return controller;
}

这里返回一个代理控制器,也许这就是我遇到错误的原因。你有什么想法如何对其进行单元测试吗?
非常感谢。

NullReferenceException 出现在哪个地方?请精确描述。 - bzlm
它出现在ControllerContext上,我认为是因为Moq正在模拟控制器并仅返回代理... 这是代码行:ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);当我悬停在上面时,ControllerContext.Controller为空。谢谢。 - Saxman
我也遇到了这个异常,在设置RouteData中的“controller”和“action”参数后。完整的堆栈跟踪:http://pastebin.com/S8c26JLD - EMP
1个回答

4

尝试这个:

public static void SetContext(this Controller controller)
        {
            var httpContextBase = new Mock<HttpContextBase>();
            var httpRequestBase = new Mock<HttpRequestBase>();
            var respone = new Mock<HttpResponseBase>();
            var session = new Mock<HttpSessionStateBase>();
            var routes = new RouteCollection();
            RouteConfigurator.RegisterRoutesTo(routes);

            httpContextBase.Setup(x => x.Response).Returns(respone.Object);
            httpContextBase.Setup(x => x.Request).Returns(httpRequestBase.Object);
            httpContextBase.Setup(x => x.Session).Returns(session.Object);
            session.Setup(x => x["somesessionkey"]).Returns("value");
            httpRequestBase.Setup(x => x.Form).Returns(new NameValueCollection());
            controller.ControllerContext = new ControllerContext(httpContextBase.Object, new RouteData(), controller);
            controller.Url = new UrlHelper(new RequestContext(controller.HttpContext, new RouteData()), routes);
        }

1
嗨Omu,我在这一行遇到了错误:ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 错误是“RouteData必须包含一个名为'controller'且具有非空字符串值的项。”谢谢。 - Saxman
我尝试了但没有成功,还是同样的错误 :( *** 编辑 *** 如何手动将控制器变量添加到RouteData中? - Saxman
变量路线=新的RouteCollection(); RouteConfigurator.RegisterRoutesTo(路线); - Omu
你是否使用了自定义的ViewEngine? - Omu
不,我正在使用MVC ViewEngine,并与将视图呈现为字符串的方法一起使用。我不确定问题出在哪里。 - Saxman
你还需要模拟视图引擎。看看这个:https://dev59.com/x0_Ta4cB1Zd3GeqPDLVa - Mariusz.W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接