단위 테스트에서 HttpContext Mocking 방법

C#에서 단위 테스트를 진행할 때 HttpContext와 관련된 로직을 테스트해야 할 경우가 있습니다. 실제 웹 요청 없이 HttpContext를 모의(Mock)하여 코드를 테스트하는 방법을 알아보겠습니다.

.NET 환경에서는 Moq와 같은 모의 프레임워크를 주로 사용합니다. Moq는 .NET에서 널리 사용되는 모의 라이브러리입니다. NuGet을 통해 설치할 수 있습니다.

dotnet add package Moq

Moq를 사용하여 가짜 HttpContext를 생성하는 간단한 예제는 다음과 같습니다. 먼저, HttpContextBase의 모의 객체를 생성합니다.

using System.Security.Claims;
using System.Web;
using Moq;

// 가짜 HttpContextBase 객체 생성
var 가짜컨텍스트 = new Mock<HttpContextBase>();

// 가짜 HttpRequestBase 설정
var 가짜요청 = new Mock<HttpRequestBase>();
가짜요청.Setup(r => r.ApplicationPath).Returns("/MyApp");
가짜요청.Setup(r => r.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection { { "HTTP_HOST", "localhost" } });
가짜컨텍스트.Setup(c => c.Request).Returns(가짜요청.Object);

// 가짜 HttpResponseBase 설정
var 가짜응답 = new Mock<HttpResponseBase>();
가짜응답.Setup(r => r.Cache).Returns(new HttpCachePolicyBase());
가짜컨텍스트.Setup(c => c.Response).Returns(가짜응답.Object);

// 가짜 HttpSessionStateBase 설정
var 가짜세션 = new Mock<HttpSessionStateBase>();
가짜세션.Setup(s => s["사용자데이터"]).Returns("테스트데이터");
가짜컨텍스트.Setup(c => c.Session).Returns(가짜세션.Object);

// 가짜 HttpServerUtilityBase 설정
var 가짜서버 = new Mock<HttpServerUtilityBase>();
가짜컨텍스트.Setup(c => c.Server).Returns(가짜서버.Object);

// 가짜 IPrincipal 설정
var 가짜사용자 = new Mock<IPrincipal>();
var 가짜아이덴티티 = new Mock<IIdentity>();
가짜아이덴티티.Setup(i => i.Name).Returns("테스트유저");
가짜아이덴티티.Setup(i => i.IsAuthenticated).Returns(true);
가짜사용자.Setup(u => u.Identity).Returns(가짜아이덴티티.Object);
가짜컨텍스트.Setup(c => c.User).Returns(가짜사용자.Object);

// 이제 가짜컨텍스트.Object를 실제 HttpContextBase 객체처럼 사용할 수 있습니다.
var httpContext = 가짜컨텍스트.Object;

// 사용 예시:
var userName = httpContext.User.Identity.Name; // "테스트유저" 반환
var isAuthenticated = httpContext.User.Identity.IsAuthenticated; // true 반환
var sessionData = httpContext.Session["사용자데이터"]; // "테스트데이터" 반환

이러한 모의 객체 생성 로직을 재사용 가능한 서비스로 만들어두면 팀원들이 쉽게 활용할 수 있습니다. 따라서 HttpContextBase의 모의 인스턴스를 제공하는 전용 서비스 클래스를 만들거나, 이러한 모의 생성 과정을 메서드로 캡슐화하여 모듈화하고 재사용성을 높일 수 있습니다.

using System.Collections.Specialized;
using System.Security.Principal;
using System.Web;
using Moq;

public static class 가짜컨텍스트생성기
{
    public static HttpContextBase 생성(
        string 사용자이름 = "기본유저",
        bool 인증여부 = true,
        string 세션키 = "기본데이터",
        object 세션값 = null,
        string 애플리케이션경로 = "/",
        NameValueCollection 서버변수 = null)
    {
        var 가짜컨텍스트 = new Mock<HttpContextBase>();

        // 가짜 HttpRequestBase 설정
        var 가짜요청 = new Mock<HttpRequestBase>();
        가짜요청.Setup(r => r.ApplicationPath).Returns(애플리케이션경로);
        가짜요청.Setup(r => r.ServerVariables).Returns(서버변수 ?? new NameValueCollection());
        가짜컨텍스트.Setup(c => c.Request).Returns(가짜요청.Object);

        // 가짜 HttpResponseBase 설정
        var 가짜응답 = new Mock<HttpResponseBase>();
        가짜응답.Setup(r => r.Cache).Returns(new HttpCachePolicyBase());
        가짜컨텍스트.Setup(c => c.Response).Returns(가짜응답.Object);

        // 가짜 HttpSessionStateBase 설정
        var 가짜세션 = new Mock<HttpSessionStateBase>();
        if (세션키 != null)
        {
            가짜세션.Setup(s => s[세션키]).Returns(세션값);
        }
        가짜컨텍스트.Setup(c => c.Session).Returns(가짜세션.Object);

        // 가짜 HttpServerUtilityBase 설정
        var 가짜서버 = new Mock<HttpServerUtilityBase>();
        가짜컨텍스트.Setup(c => c.Server).Returns(가짜서버.Object);

        // 가짜 IPrincipal 설정
        var 가짜사용자 = new Mock<IPrincipal>();
        var 가짜아이덴티티 = new Mock<IIdentity>();
        가짜아이덴티티.Setup(i => i.Name).Returns(사용자이름);
        가짜아이덴티티.Setup(i => i.IsAuthenticated).Returns(인증여부);
        가짜사용자.Setup(u => u.Identity).Returns(가짜아이덴티티.Object);
        가짜컨텍스트.Setup(c => c.User).Returns(가짜사용자.Object);

        return 가짜컨텍스트.Object;
    }
}

이 서비스를 사용하여 다양한 조건의 HttpContext를 쉽게 생성할 수 있습니다.

var httpContext = 가짜컨텍스트생성기.생성(
    사용자이름: "사용자A",
    인증여부: false,
    세션키: "특정데이터",
    세션값: "특정값",
    애플리케이션경로: "/MyApplication",
    서버변수: new NameValueCollection { { "SERVER_NAME", "dev-server" } }
);

// 사용 예시:
var userName = httpContext.User.Identity.Name; // "사용자A" 반환
var isAuthenticated = httpContext.User.Identity.IsAuthenticated; // false 반환
var customData = httpContext.Session["특정데이터"]; // "특정값" 반환
var appPath = httpContext.Request.ApplicationPath; // "/MyApplication" 반환
var serverName = httpContext.Request.ServerVariables["SERVER_NAME"]; // "dev-server" 반환

태그: C# 단위 테스트 Moq HttpContext ASP.NET

6월 9일 02:25에 게시됨