2012-09-24 3 views
3

메시지 큐를 들여다 볼 때 호출되는 콜백 메소드를 유닛 테스트하고이를 수행하는 방법을 알 수 없습니다.유닛 테스트 peek이 완료되었을 때 사용되는 비동기 콜백 메소드

내 추상 클래스;

public abstract class QueueHandler : WindowsServiceBase 
{ 
    private readonly IMessageQueueWrapper _listeningQueue; 
    private PeekCompletedEventHandler _peekHandler; 

    protected QueueHandler(IMessageQueueWrapper listeningQueue) 
     : base() 
    { 
     _listeningQueue = listeningQueue; 
    } 

    protected override void ExecuteInternal() 
    { 
     _listeningQueue.BeginPeek(); 
    } 

    protected override void ConfigureInternal() 
    { 
     if (_peekHandler != null) return; 

     _peekHandler = OnPeekCompleted; 
     _listeningQueue.PeekCompleted += OnPeekCompleted; 
    } 

    protected void OnPeekCompleted(object sender, PeekCompletedEventArgs e) 
    { 
     try 
     { 
      var msg = _listeningQueue.EndPeek(e.AsyncResult); 

      ... 
     } 
     catch (Exception ex) 
     { 
      ... 
     } 
    } 
} 

내 구체적인 클래스는 unittesting에 사용됩니다.

internal class QueueuHandlerImplementation : QueueHandler 
{ 
    public QueueuHandlerImplementation(IMessageQueueWrapper listeningQueue) 
     : base(listeningQueue) 
    { 
    } 
} 

내 단위 테스트; PeekCompletedEventArgs는 기본 생성자를 가지고 있지 않기 때문에

public void OnPeekCompletedWhenBeginPeekShouldCallOnPeekCompleted() 
{ 
     QueueuHandlerImplementation queueHandler = new QueueuHandlerImplementation(_listeningQueueMock.Object); 

    //Arrange 
    queueHandler.Configure(); 
    _listeningQueueMock.Setup(m => m.BeginPeek()).Raises(
        m => m.PeekCompleted += null, new PeekCompletedEventArgs() { AsyncResult = new Mock<IAsyncResult>().Object}); 

    //Act 
    _queueHandler.Execute(); 

    //Assert 
    Assert.AreEqual(true, _queueHandler.IsConfigured); 
} 

이 불가능합니다.

public void OnPeekCompletedWhenBeginPeekShouldCallOnPeekCompleted() 
{ 
     QueueuHandlerImplementation queueHandler = new QueueuHandlerImplementation(_listeningQueueMock.Object); 

    //Arrange 
    queueHandler.Configure(); 
    _listeningQueueMock.Setup(m => m.BeginPeek()).Raises(
       m => m.PeekCompleted += null, PeekCompletedEventArgs.Empty); 

    //Act 
    _queueHandler.Execute(); 

    //Assert 
    Assert.AreEqual(true, _queueHandler.IsConfigured); 
} 

이것은 좋은 보이지만 실행 호출 할 때 내가 유형의 개체라는 오류 얻을 " '경우 System.EventArgs는'System.Messaging.PeekCompletedEventArgs을 '형식으로 변환 할 수 없습니다."... 그리고 난 몰라 내가 멀리 얻을 수 있다면 어떤 AsyncResult 돌봐.

답변

2

당신은 내부 생성자를 사용하여 인스턴스를 만들 수 있습니다

MessageQueue sender = null; 
IAsyncResult result = null; 
var e = Activator.CreateInstance(typeof(System.Messaging.PeekCompletedEventArgs), 
           BindingFlags.NonPublic | BindingFlags.Instance, 
           null, new object[]{sender, result}, null); 

참고 : sender 당신이 Message 속성에 액세스 할 때 null는 NullReferenceException이 이어질 것이라는 사실을.

+0

예, 물론 감사합니다. – Per