Unit Testing Web Services - HttpContext

后端 未结 5 876
日久生厌
日久生厌 2021-01-31 00:20

I want to write unit tests for a web service. I create my test project, reference my web project (not service reference, assembly reference), then write some code to test the we

5条回答
  •  灰色年华
    2021-01-31 00:58

    Here is a related discussion.

    I stopped referencing HttpContext.Current directly. and use this class instead:

    public class HttpContextFactory
    {
        private static HttpContextBase m_context;
        public static HttpContextBase Current
        {
            get
            {
                if (m_context != null)
                    return m_context;
    
                if (HttpContext.Current == null)
                    throw new InvalidOperationException("HttpContext not available");
    
                return new HttpContextWrapper(HttpContext.Current);
            }
        }
    
        public static void SetCurrentContext(HttpContextBase context)
        {
            m_context = context;
        }
    }
    

    and use HttpContextFactory.Current instead of HttpContext.Current in our code.

    Then you write this in your test:

            HttpContextFactory.SetCurrentContext(GetMockedHttpContext());
    

    where GetMockedHttpContext() is from here and looks like this:

        private System.Web.HttpContextBase GetMockedHttpContext()
        {
            var context = new Mock();
            var request = new Mock();
            var response = new Mock();
            var session = new Mock();
            var server = new Mock();
            var user = new Mock();     
            var identity = new Mock();
    
            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.Setup(ctx => ctx.User).Returns(user.Object);
            user.Setup(x => x.Identity).Returns(identity.Object);
            identity.Setup(id => id.IsAuthenticated).Returns(true);
            identity.Setup(id => id.Name).Returns("test");
    
            return context.Object;
        }
    

    It uses a mocking framework called moq

    In your test project you have to add a reference to System.Web and System.Web.Abstractions, where HttpContextBase is defined.

提交回复
热议问题