🧩 정의

NSubstitute란?

NSubstitute는 .NET 환경에서 Mock 객체를 쉽게 만들고, 호출 여부와 반환값을 검증할 수 있게 해주는 테스트 라이브러리이다.

  • 인터페이스나 가상 메서드의 동작을 흉내낼 수 있다.
  • 테스트에서 외부 의존성을 분리할 때 유용하다.
  • Received() 같은 문법으로 호출 검증을 할 수 있다.

⚙️ 환경구성

NSubstitute NuGet 설치

image

커맨드 창을 열어 nuget.exe 파일 경로로 이동

커맨드라인 입력하여 실행

nuget.exe Install NSubstitute.Analyzers.CSharp -Version 1.0.15

image

DLL 파일을 저장하고자 하는 경로에 Import

  • 이때 Castle.Core.dll 파일도 같은 경로에 import 해야 한다.

image

image

image {: width=”50%” height=”50%”}

Unity Play TestRunner를 생성한 후 Play Tests 파일에 Assembly References를 등록

image

Player TestRunner 생성 방법은 => TestRunner 참고

🛠 핵심 사용법

  • Substitute.For<T>()로 Mock 객체를 만든다.
  • 반환값이 있는 메서드는 Returns()로 결과를 지정한다.
  • 호출 여부는 Received()로 검증한다.
  • 호출하지 않았는지는 DidNotReceive()로 확인한다.

🧪 테스트

소스코드

  • 간단한 테스트를 통해 몇가지 함수를 확인
//Mock 생성을 위한 인터페이스 정의
public interface ITestObj
{
	public int PropertyValue { get; set; }
	public void DoNothing(int input);
	public int AddOne(int input);
}

// 단위테스트
public class TestTestObj
{
	ITestObj testObj;

	[SetUp]
	public void SetUp()
	{
		testObj = Substitute.For<ITestObj>(); // Mock Instance 생성
		testObj.AddOne(1).Returns(2); // 반환값이 있는 함수의 리턴값 정의
		testObj.PropertyValue.Returns(2); // Property 반환값 정의
	}

	[UnityTest]
	public IEnumerator TestTestObjAddOne()
	{
		Debug.Log($"AddOne(1) : {testObj.AddOne(1)}");
		Assert.AreEqual(2, testObj.AddOne(1));
		testObj.DoNothing(3);

		// 반환값이 없는 함수가 호출되었는지에 대한 검증
		testObj.Received().DoNothing(3);

		// 반환값이 없는 함수가 호출되지 않았는지에 대한 검증
		//testObj.DidNotReceive().AddOne(2);

		yield return null;
    }
}

결과

image

⚠️ 주의사항

  • Mock 대상은 보통 인터페이스나 virtual 메서드가 적합하다.
  • 너무 많은 동작을 한 테스트에서 검증하면 읽기 어려워질 수 있다.
  • 외부 의존성만 흉내 내고, 테스트 대상 로직 자체는 실제로 검증해야 한다.
  • Castle.Core.dll 의존성이 함께 필요할 수 있다.

📌 정리

  • NSubstitute는 .NET 테스트에서 Mock 객체를 쉽게 만드는 라이브러리다.
  • Returns(), Received(), DidNotReceive()가 핵심 문법이다.
  • Unity Play Mode 테스트에서도 외부 의존성을 분리할 때 유용하다.

연결문서

태그:

카테고리:

업데이트:

댓글남기기