goscamp
goscamp

Reputation: 1106

Disappearing cookies from Request when remove Cookies from Response while Testing C#

I try to mock the system in order to test controller.

        [TestMethod]
        public static HttpContextBase TestController()
        {
            Container _container = GetContainer();
            // Setup Moq config for controller context
            var moqContext = new Mock<HttpContextBase>();
            var moqRequest = new Mock<HttpRequestBase>();
            var moqResponse = new Mock<HttpResponseBase>();
            var moqSession = new Mock<HttpSessionStateBase>();
            var moqServer = new Mock<HttpServerUtilityBase>();
            var fakeIdentity = new GenericIdentity("User");
            var principal = new GenericPrincipal(fakeIdentity, null);

            moqRequest.SetupGet(x => x.Url).Returns(new Uri("http://10.00.00:11111/", UriKind.RelativeOrAbsolute));
            moqRequest.SetupGet(x => x.ServerVariables).Returns(new NameValueCollection());
            //moq Context
            moqContext.SetupGet(x => x.Request).Returns(moqRequest.Object);
            moqContext.SetupGet(x => x.Request.Cookies).Returns(new HttpCookieCollection());
            moqContext.SetupGet(x => x.Response).Returns(moqResponse.Object);
            moqContext.SetupGet(x => x.Response.Cookies).Returns(new HttpCookieCollection());
            moqContext.SetupGet(x => x.Session).Returns(moqSession.Object);
            moqContext.SetupGet(x => x.Server).Returns(moqServer.Object);
            moqContext.SetupGet(x => x.User).Returns(principal);
            moqContext.SetupGet(x => x.User.Identity.Name).Returns("UserName");
            var contextRequest = new HttpRequest("", "http://10.0.0.00:11111/User/Login", "");
            var contextResponse = new HttpResponse(new StringWriter());
            HttpContext.Current = new HttpContext(contextRequest, contextResponse);
            HttpContext.Current.User = principal;
            // Authenticate User
            IUsuarioAppService _usuarioApp = _container.GetInstance<IUsuarioAppService>();
            var usuario = _usuarioApp.AutenticarUsuario(username, password);
            var usuarioController = _container.GetInstance<UsuariosController>();
            usuarioController.ControllerContext = new ControllerContext(moqContext.Object, new RouteData(), usuarioController);
            usuarioController.Login(true, "", usuario);

            foreach (var key in moqContext.Object.Response.Cookies.AllKeys)
            {
                var cookieItem = moqContext.Object.Response.Cookies[key];
                var cookie = new HttpCookie(key, cookieItem.Value);
                cookie.Expires = DateTime.Now.AddMinutes(30);
                HttpContext.Current.Request.Cookies.Add(cookie);
                moqContext.Object.Request.Cookies.Add(cookie);
            }
            var controller = _container.GetInstance<HomeController>();
            controller.ControllerContext = new ControllerContext(moqContext.Object, new RouteData(), controller);
        }

        var scenario1 = controller.New(model1) as ViewResult;

The problem is that inside method New in HomeController I remove the cookies of Response, and then the all cookies of Request disappear. Normally it is not happening, only when I am testing.

        internal static void SetCookie(string key, object value)
        {
            var cookie = new HttpCookie(key, value != null ? value.ToString() : null);
            cookie.Path = HttpRuntime.AppDomainAppVirtualPath;
            cookie.Expires = DateTime.UtcNow.AddDays(3);
            cookie.HttpOnly = true;

            if (value == null)
                cookie.Expires = DateTime.Now.AddDays(-1d);

            if (HttpContext.Current.Response.Cookies.AllKeys.Contains(key))
            {
                HttpContext.Current.Response.Cookies.Remove(key);
                HttpContext.Current.Response.AppendCookie(cookie);
            }
            else
            {
                HttpContext.Current.Response.AppendCookie(cookie);
            }
        }

What can be the reseaon of this? Do I Add correctly cookies to HttpContext?

Upvotes: 3

Views: 233

Answers (1)

ste-fu
ste-fu

Reputation: 7434

What makes you think the cookies are present on the request in the first place? As I read it

 moqContext.SetupGet(x => x.Request).Returns(moqRequest.Object);
 moqContext.SetupGet(x => x.Request.Cookies).Returns(new HttpCookieCollection());

will mean that no cookies are ever set on the request

Upvotes: 2

Related Questions