C# - .NET Core/5+ 환경에서 Fakes를 이용한 단위 테스트 방법
예전에 .NET Framework 환경에서만 하다가,
Visual Studio의 단위 테스트 작성 시 Fakes를 이용한 메서드 재정의 방법
; https://www.sysnet.pe.kr/2/0/10858
.NET core/5+ 환경으로 오면서는 해본 적이 없어 이참에 한번 해봤습니다.
우선, .NET 6 라이브러리 프로젝트를 만들고, 테스트를 위해 Microsoft.Data.SqlClient 패키지를 참조한 다음,
Install-Package Microsoft.Data.SqlClient
이렇게 코드를 추가합니다.
using Microsoft.Data.SqlClient;
namespace ClassLibrary1
{
public class Class1
{
public void Test()
{
SqlConnection sqlCon = new SqlConnection();
sqlCon.ConnectionString = "test";
sqlCon.Open();
}
}
}
당연히 위의 코드는 연결 문자열이 잘못되었으므로 그냥 실행하면 예외가 발생합니다. 자, 그럼 이 상태에서 Test 메서드를 우클릭해 단위 테스트를 만들고,
이로 인해 생성한 ClassLibrary1Tests 프로젝트의 "Dependencies" 하위에서 Microsoft.Data.SqlClient.dll에 대해 "Add Fakes Assembly" 메뉴를 선택합니다.
그럼 다음과 같이 "Fakes" 디렉터리가 생기고 "Microsoft.Data.SqlClient.fakes" 항목이 생깁니다.
Microsoft.Data.SqlClient.fakes 파일을 열어보면 단순 텍스트 파일이고 여기서
좀 더 상세한 제어를 추가할 수 있습니다.
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="Microsoft.Data.SqlClient" Version="5.0.0.0"/>
</Fakes>
환경 설정은 이걸로 끝입니다, 남은 작업은 Shim을 이용해 테스트를 작성하기만 하면 됩니다.
using Microsoft.Data.SqlClient.Fakes;
using Microsoft.QualityTools.Testing.Fakes;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace ClassLibrary1.Tests
{
[TestClass()]
public class Class1Tests
{
[TestMethod()]
public void TestTest()
{
using (ShimsContext.Create())
{
ShimSqlConnection.AllInstances.Open =
(thisInstance) => Console.WriteLine("Open");
Class1 class1 = new Class1();
class1.Test();
}
}
}
}
원래 코드에서는 ConnectionString에 "test" 연결 문자열을 줬기 때문에 예외가 발생해야 하지만, 위의 ShimsContext 내에서 실행하는 SqlConnection.Open은 Console.WriteLine 코드만 수행하므로 아무런 예외 없이 테스트 통과를 하게 됩니다.
.NET Framework 시절과 비교해 딱히 바뀐 것은 없고, 단지 Fake 해야 할 어셈블리를 찾기 위해 Dependencies를 헤매야 하는 불편함 정도만 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]