我已经模拟了我的控制器的所有部分,除了下面这行抛出“对象未设置为对象的实例”错误消息。Response.Cookies.Clear();我有以下扩展方法来模拟控制器上下文,它适用于我迄今为止遇到的所有其他事情(非常感谢这个论坛上的好人)。publicstaticintSetUpForTest(thisSystem.Web.Mvc.Controllerctl,stringusername,TestingUtility.Rolesrole){varroutes=newRouteCollection();MvcApplication.RegisterRoutes(路线);varrequest=newMock(MockBehavior.Strict);request.SetupGet(x=>x.ApplicationPath).Returns("/");request.SetupGet(x=>x.Url).Returns(newUri("http://localhost/a",UriKind.Absolute));request.SetupGet(x=>x.ServerVariables).Returns(newSystem.Collections.Specialized.NameValueCollection());varresponse=newMock(MockBehavior.Strict);response.Setup(x=>x.ApplyAppPathModifier(Moq.It.IsAny())).Returns((Stringurl)=>url);//response.SetupGet(x=>x.Cookies).Returns(newHttpCookieCollection());//这也失败了varcontext=newMock(MockBehavior.Strict);context.SetupGet(x=>x.Request).Returns(request.Object);context.SetupGet(x=>x.Response).Returns(response.Object);context.SetupGet(x=>x.Response.Cookies).Returns(新的HttpCookieCollection());//仍然不能调用Clear()方法////模拟控制器上下文(使用上面模拟的对象)//varmoqCtx=newMock(context.Object,newRouteData(),ctl);moqCtx.SetupGet(p=>p.HttpContext.User.Identity.Name).Returns(用户名);moqCtx.SetupGet(p=>p.HttpContext.User.Identity.IsAuthenticated).Returns(true);如果(!string.IsNullOrEmpty(role.ToString()))moqCtx.Setup(p=>p.HttpContext.User.IsInRole(role.ToString())).Returns(true);////传递模拟的ControllerContext并为控制器创建UrlHelper并返回//ctl.ControllerContext=moqCtx.Object;ctl.Url=newUrlHelper(newRequestContext(context.Object,newRouteData()),routes);返回1;}就像你在上面所做的那样从我所看到的,我试图模拟cookie集合的“获取”,但没有用。此外,不能模拟实际的Clear()方法,因为它不是虚拟的。显然我不希望测试cookie被清除,我只想在测试中忽略它。谢谢,格雷格这在我做饼干时对我有用。清除()varrequest=newMock(MockBehavior.Strict);request.SetupGet(x=>x.ApplicationPath).Returns("/");request.SetupGet(x=>x.Url).Returns(newUri("http://localhost/a",UriKind.Absolute));request.SetupGet(x=>x.ServerVariables).Returns(newSystem.Collections.Specialized.NameValueCollection());varresponse=newMock(MockBehavior.Strict);response.Setup(x=>x.ApplyAppPathModifier(Moq.It.IsAny())).Returns((Stringurl)=>url);//response.SetupGet(x=>x.Cookies).Returns(newHttpCookieCollection());//这也失败了varcontext=newMock(MockBehavior.Strict);context.SetupGet(x=>x.Request).Returns(request.Object);context.SetupGet(x=>x.Response).Returns(response.Object);context.SetupGet(x=>x.Response.Cookies).Returns(newHttpCookieCollection());//仍然不能调用Clear()方法context.SetupGet(p=>p.User.Identity.Name).Returns("blah");context.SetupGet(p=>p.User.Identity.IsAuthenticated).Returns(true);变量rc=newRequestContext(context.Object,newRouteData());controller.ControllerContext=newControllerContext(rc,controller);(这只是答案的一半,但对于评论字段来说太大了......)你模拟newHttpCookieCollection()是正确的此代码适用于分离:varrequest=newMock(MockBehavior.Strict);request.SetupGet(x=>x.ApplicationPath).Returns("/");request.SetupGet(x=>x.Url).Returns(newUri("http://localhost/a",UriKind.Absolute));request.SetupGet(x=>x.ServerVariables).Returns(newSystem.Collections.Specialized.NameValueCollection());varresponse=newMock(MockBehavior.Strict);response.Setup(x=>x.ApplyAppPathModifier(Moq.It.IsAny())).Returns((Stringurl)=>url);//response.SetupGet(x=>x.Cookies).Returns(newHttpCookieCollection());//这也失败了varcontext=newMock(MockBehavior.Strict);context.SetupGet(x=>x.Request).Returns(request.Object);context.SetupGet(x=>x.Response).Returns(response.Object);context.SetupGet(x=>x.Response.Cookies).Returns(newHttpCookieCollection());//仍然不能调用Clear()方法//在这里清除cookie工作得很好:varinstance=context.Object;instance.Response.Cookies.Clear();所以错误不在那里,而在其他地方。如果您从代码中注释掉Response.Cookies.Clear()行会发生什么?其他一切都被嘲笑了吗?当您调试测试时,您能否看到模拟的其余部分按预期运行?如果是的话我会很惊讶(但我之前很惊讶......)。以上就是C#学习教程:MOQ-模拟MVC控制器的Response.Cookies.Clear()分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处:
