작성일 :


단위 테스팅

단위 테스트는 소프트웨어 개발의 중요한 요소 중 하나이다.

코드의 격리된 부분을 테스트함으로써, 개발자는 더 견고하고 신뢰할 수 있는 프로그램을 만들 수 있다.

이러한 과정에서, 모의 객체(mock objects) 또는 mocks 의 사용은 필수불가결한데, 이는 복잡한 의존성을 가진 코드를 테스트할 때 특히 중요하다.

.NET 환경에서 NSubstitute 는 이러한 목적을 위해 널리 사용되는 프레임워크 중 하나이다.



NSubstitute 소개

NSubstitute.NET 언어 (C#, VB.NET 등) 를 위한 강력하면서도 사용하기 쉬운 모의 객체 라이브러리이다.

단위 테스트를 작성할 때, NSubstitute 를 사용하면, 실제 구현 대신 인터페이스클래스가짜 버전 을 쉽게 생성할 수 있다.

이렇게 하면, 테스트하고자 하는 코드의 특정 부분에 집중할 수 있으며, 외부 시스템, 데이터베이스 호출, 복잡한 클래스 등에 대한 의존성 없이 코드를 검증할 수 있다.



기본 사용법

가짜 객체 생성

NSubstitute 를 사용하여 가짜 객체를 생성하는 것은 매우 간단하다.

예를 들어, IOrder 인터페이스에 대한 가짜 객체를 생성하려면 다음과 같이 한다 :

1
var order = Substitute.For<IOrder>();


이 한 줄의 코드로, NSubstituteIOrder 인터페이스를 구현하는 가짜 객체를 자동으로 생성한다.


메서드 동작 설정

가짜 객체의 메서드가 호출될 때, 원하는 동작을 설정할 수 있다.

예를 들어, GetOrderName() 메서드가 "Test Order" 이라는 문자열을 반환하도록 설정할 수 있다 :

1
order.GetOrderName().Returns("Test Order");


이 설정을 통해 GetOrderName() 메서드가 호출될 때마다, "Test Order" 문자열이 반환된다.


호출 검증

NSubstitute 를 사용하면 특정 메서드가 호출되었는지, 호출되었다면 몇 번 호출되었는지 등을 검증할 수 있다.

예를 들어, Submit() 메서드가 한 번 호출되었는지 확인하려면 다음과 같이 한다 :

1
order.Received(1).Submit();


이 코드는 Submit() 메서드가 정확히 한 번 호출되었음을 검증한다.



고급 사용법

인수 매칭

NSubstitute 는 메서드 호출 시 전달되는 인수를 기반으로 동작을 설정하거나 검증할 수 있는 기능을 제공한다.

예를 들어, GetOrderById(int id) 메서드가 특정 ID 에 대해, 특정 동작을 하도록 설정할 수 있다 :

1
order.GetOrderById(Arg.Is(42)).Returns("Special Order");


이 코드는 GetOrderById() 메서드에 42 가 인수로 전달될 때, "Special Order" 을 반환하도록 설정한다.


예외 발생 설정

테스트 중에 메서드가 특정 조건에서 예외를 발생시키는 것을 시뮬레이션하고 싶을 때, NSubstitute 는 이를 쉽게 설정할 수 있게 해준다 :

1
order.When(x => x.Submit()).Do(x => { throw new Exception("Error"); });


이 설정을 통해 Submit() 메서드가 호출될 때마다 지정된 예외가 발생한다.


이벤트 구독 및 발생

NSubstitute 를 사용하면 가짜 객체의 이벤트에 대한 구독 및 이벤트 발생도 시뮬레이션할 수 있다.

예를 들어, OrderProcessed 이벤트에 대한 구독과 이벤트 발생을 다음과 같이 설정할 수 있다 :

1
2
3
4
5
// 이벤트 구독
order.OrderProcessed += (sender, args) => { /* 이벤트 핸들러 코드 */ };

// 이벤트 발생 시뮬레이션
order.OrderProcessed += Raise.EventWith(new object(), new EventArgs());


이 방법을 통해 이벤트가 발생했을 때의 코드 동작을 테스트할 수 있다.



결론

NSubstitute.NET 개발자들에게 단위 테스팅을 위한 강력한 도구를 제공한다.

이를 통해, 복잡한 의존성을 가진 코드를 쉽게 격리하여 테스트할 수 있으며, 코드의 견고성과 신뢰성을 향상시킬 수 있다.

가짜 객체 생성부터 고급 기능에 이르기까지, NSubstitute 는 단위 테스트의 효율성과 효과성을 크게 높여준다.