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" 반환