当前位置: 首页 > 编程语言 > C#

模拟与HttpContextBase.get_User()分享

时间:2023-04-10 14:48:31 C#

模拟与HttpContextBase.get_User()我想模拟HttpContext的User属性。我将ScottHanselman的MVCHelper类与RhinoMocks一起使用。我有一个单元测试,代码如下:...MockIdentityfakeId=newMockIdentity("TEST_USER","Windows",true);MockPrincipalfakeUser=newMockPrincipal(null,fakeId);使用(mocks.Record()){Expect.Call(fakeHttpContext.User).Return(fakeUser);}...我的MockIdentity和MockPrincipal类分别是符合IIdentity和IPrincipal的模拟。运行报告的单元测试时出错:System.NotImplementedException:方法或操作未实现。在System.Web.HttpContextBase.get_User()中,当我尝试对User属性设置期望值时会发生这种情况。我知道httpContextBase有一个未实现的getter和setter,但我认为Rhino会在模拟时处理这个问题。这是否意味着我必须从HttpContextbase派生并覆盖我的模拟对象的属性。这看起来很奇怪。其他用户遇到过此问题并在此处报告:http://www.mail-archive.com/rhinomocks@googlegroups.com/msg00546.html要模拟用户属性,您可以这样做:varhttpContext=MockRepository。生成存根();httpContext.Stub(x=>x.User).Return(yourFakePrincipalHere);varcontrollerContext=newControllerContext(httpContext,....);varcontroller=newHomeController();controller.ControllerContext=controllerContext;(这使用新的RM3.5api,如果您正在录制/重放,则:}using(mocks.PlayBack()){....}我遇到了几乎相同的问题并转移到最小起订量。这是我在我的应用程序中使用的自定义助手:publicstaticclassMvcMockHelpers{publicstaticHttpContextBaseFakeHttpContext(){varcontext=newMock();varrequest=newMock();varresponse=newMock();varsession=newMock();varserver=newMock();context.Expect(ctx=>ctx.Request).Returns(request.Object);context.Expect(ctx=>ctx.Response).Returns(response.Object);context.Expect(ctx=>ctx.Session).Returns(session.Object);context.Expect(ctx=>ctx.Server).Returns(server.Object);varform=newNameValueCollection();varquerystring=newNameValueCollection();varcookies=newHttpCookieCollection();varuser=newGenericPrincipal(newGenericIdentity("testuser"),newstring[]{"Administrator"});request.Expect(r=>r.Cookies).Returns(cookies);request.Expect(r=>r.Form).Returns(form);request.Expect(q=>q.QueryString).Returns(querystring);response.Expect(r=>r.Cookies).Returns(cookies);context.Expect(u=>u.User).Returns(user);返回上下文。目的;}publicstaticHttpContextBaseFakeHttpContext(stringurl){HttpContextBasecontext=FakeHttpContext();context.Request.SetupRequestUrl(url);返回上下文;}publicstaticvoidSetFakeControllerContext(thisControllercontroller){varhttpContext=FakeHttpContext();ControllerContextcontext=newControllerContext(newRequestContext(httpContext,newRouteData()),controller);controller.ControllerContext=上下文;}publicstaticvoidSetFakeControllerContext(thisControllercontroller,RouteDatarouteData){SetFakeControllerContext(controller,newDictionary(),newHttpCookieCollection(),routeData);}publicstaticvoidSetFakeControllerContext(thisControllercontroller,HttpCookieCollectionrequestCookies){SetFakeControllerContext(controller,newDictionary(),requestCookies,newRouteData());}publicstaticvoidSetFakeControllerContext(thisControllercontroller,DictionaryformValues){SetFakeControllerContext(controll呃,formValues,newHttpCookieCollection(),newRouteData());}publicstaticvoidSetFakeControllerContext(thisControllercontroller,DictionaryformValues,HttpCookieCollectionrequestCookies,RouteDatarouteData){varhttpContext=FakeHttpContext();foreach(formValues.Keys中的字符串键){httpContext.Request.Form.Add(key,formValues[key]);}foreach(requestCookies.Keys中的字符串键){httpContext.Request.Cookies.Add(requestCookies[key]);}ControllerContextcontext=newControllerContext(newRequestContext(httpContext,routeData),controller);controller.ControllerContext=上下文;}publicstaticvoidSetFakeControllerContextWithLogin(thisControllercontroller,stringuserName,stringpassword,stringreturnUrl){varhttpContext=FakeHttpContext();httpContext.Request.Form.Add("用户名",userName);httpContext.Request.Form.Add("密码",密码);httpContext.Request.QueryString.Add("ReturnUrl",returnUrl);ControllerContext公司ntext=newControllerContext(newRequestContext(httpContext,newRouteData()),controller);controller.ControllerContext=上下文;}staticstringGetUrlFileName(stringurl){if(url.Contains("?"))returnurl.Substring(0,url.IndexOf("?"));否则返回网址;}staticNameValueCollectionGetQueryStringParameters(stringurl){if(url.Contains("?")){NameValueCollectionparameters=newNameValueCollection();string[]parts=url.Split("?".ToCharArray());string[]keys=parts[1].Split("&".ToCharArray());foreach(键中的字符串键){string[]part=key.Split("=".ToCharArray());参数.Add(部分[0],部分[1]);}返回参数;}else{返回空值;}}publicstaticvoidSetHttpMethodResult(thisHttpRequestBaserequest,stringhttpMethod){Mock.Get(request).Expect(req=>req.HttpMethod).Returns(httpMethod);}publicstaticvoidSetupRequestUrl(thisHttpRequestBaserequest,stringurl){if(url==null)thrownewArgumentNullExce选项(“网址”);if(!url.StartsWith("~/"))thrownewArgumentException("抱歉,我们希望虚拟url以"~/"开头。");varmock=Mock.Get(请求);mock.Expect(req=>req.QueryString).Returns(GetQueryStringParameters(url));mock.Expect(req=>req.AppRelativeCurrentExecutionFilePath).Returns(GetUrlFileName(url));mock.Expect(req=>req.PathInfo).Returns(string.Empty);}[免责声明:我在Typemock上工作]我知道这不是你问的,但看看上面的答案,我必须展示另一种方法来做你需要的-使用隔离器:以上是所有分享的内容C#学习教程:模拟和HttpContextBase.get_User()。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——varfakeId=Isolate.Fake。实例();Isolate.WhenCalled(()=>fakeId.AuthenticationType).WillReturn("Windows");Isolate.WhenCalled(()=>fakeId.Name).WillReturn("TEST_USER");Isolate.WhenCalled(()=>fakeId.IsAuthenticated).WillReturn(true);varfakePrincipal=Isolate.Fake.Instance();Isolate.WhenCalled(()=>fakePrincipal.Identity).WillReturn(fakeId);varfakeContext=Isolate.Fake.Instance();隔离.WhenCalled(()=>fakeContext.User).WillReturn(fakePrincipal);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: