2011-03-16 4 views
3

단위 테스트 방법에 대한 기본 사항을 이해하지만 테스트 할 의미있는 것을 찾는 데 어려움을 겪습니다. 가짜 구현을 만들어 소비자에게 주입해야한다고 생각합니다. 새 메일에 대한 업데이트를 요청하는 Exchange 2010 (Exchange 웹 서비스 (EWS) 사용) 구독을 담당하는 서비스 클래스가 있습니다. 구독 구현을 서비스 자체에서 분리하기 위해 구현을 서비스에 삽입하기로 결정했습니다. 아래는 내가 현재 가지고있는 것입니다. Exchange와 통신하는 코드를 생략했습니다.가짜를위한 의미있는 단위 테스트를 만드는 방법

// Not a big fan of having two identical interfaces... 
public interface IStreamingNotificationService 
{ 
    void Subscribe(); 
} 

public interface IExchangeService 
{ 
    void Subscribe(); 
} 

public class StreamingNotificationService : IStreamingNotificationService 
{ 
    private readonly IExchangeService _exchangeService; 

    public StreamingNotificationService(IExchangeService exchangeService) 
    { 
     if (exchangeService == null) 
     { 
      throw new ArgumentNullException("exchangeService"); 
     } 

     _exchangeService = exchangeService; 
    } 

    public void Subscribe() 
    { 
     _exchangeService.Subscribe(); 
    } 
} 

public class ExchangeServiceImpl : IExchangeService 
{ 
    private readonly INetworkConfiguration _networkConfiguration; 
    private ExchangeService ExchangeService { get; set; } 

    public ExchangeServiceImpl(INetworkConfiguration networkConfiguration) 
    { 
     if (networkConfiguration == null) 
     { 
      throw new ArgumentNullException("networkConfiguration"); 
     } 

     _networkConfiguration = networkConfiguration; 
     // Set up EWS 
    } 

    public void Subscribe() 
    { 
     // Subscribe for new mail notifications. 
    } 
} 

더 구체적으로 말하면 구독 방식이 제대로 작동하는지 확인하기 위해 의미있는 단위 테스트를 만드는 방법은 무엇입니까?

답변

3

일반적으로 가짜 프레임 워크를 사용하여 가짜 교환을 만들고 구독이 실제로 호출 된이 개체를 테스트합니다. 보통 Rhino Mocks을 사용하며 테스트 결과는 다음과 같습니다. 이 같은 (그것을 구현하는 방법에는 여러 가지가 있습니다) :

[Test] 
public void SubscribesToExchange() 
{ 
    var exchange = MockRepository.GenerateMock<IExchangeService>(); //this is the stub 
    var service = StreamingNotificationService(exchange); //this is the object we are testing 

    service.Subscribe(); 
    service.AssertWasCalled(x => x.Subscribe();); 
} 
1

디커플링 및 사출 항상 유닛 테스트의 측면에서 아주 좋은 생각입니다.

이제 StreamingNotificationService 클래스를 쉽게 테스트 할 수 있습니다. 구성이 잘 작동하는지, 그리고 subscribeemethod가 삽입 된 (그리고 가짜) IExchangeService를 호출하는지 테스트하는 것입니다.

관련 문제