How do you mock the session object collection using Moq

前端 未结 7 631
忘了有多久
忘了有多久 2020-11-28 22:08

I am using shanselmann\'s MvcMockHelper class to mock up some HttpContext stuff using Moq but the issue I am having is being able to assign something to my mocked session ob

7条回答
  •  一整个雨季
    2020-11-28 22:36

    Thank you, @RonnBlack for your solution! In my case, I kept getting this exception because Session.SessionID was null:

    System.NotImplementedException was unhandled by user code
      HResult=-2147467263
      Message=The method or operation is not implemented.
      Source=System.Web
      StackTrace:
           at System.Web.HttpSessionStateBase.get_SessionID()
    

    To solve this problem I implement @RonnBlack's code this way using the Moq Mock instead of his MockHttpSession:

        private readonly MyController controller = new MyController();
    
        [TestFixtureSetUp]
        public void Init()
        {
            var session = new Mock();
            session.Setup(s => s.SessionID).Returns(Guid.NewGuid().ToString());
            var request = new Mock();
            var response = new Mock();
            var server = new Mock();
            // Not working - IsAjaxRequest() is static extension method and cannot be mocked
            // request.Setup(x => x.IsAjaxRequest()).Returns(true /* or false */);
            // use this
            request.SetupGet(x => x.Headers).Returns(
                new System.Net.WebHeaderCollection
                {
                    {"X-Requested-With", "XMLHttpRequest"}
                });
    
            var context = new Mock();
            //context
            context.Setup(ctx => ctx.Request).Returns(request.Object);
            context.Setup(ctx => ctx.Response).Returns(response.Object);
            context.Setup(ctx => ctx.Session).Returns(session.Object);
            context.Setup(ctx => ctx.Server).Returns(server.Object);
            context.SetupGet(x => x.Request).Returns(request.Object);
            context.SetupGet(p => p.Request.Url).Returns(new Uri("http://www.mytesturl.com"));
            var queryString = new NameValueCollection { { "code", "codeValue" } };
            context.SetupGet(r => r.Request.QueryString).Returns(queryString);
    
            controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
        }
    

    For details, please see http://weblogs.asp.net/gunnarpeipman/using-moq-to-mock-asp-net-mvc-httpcontextbase

提交回复
热议问题