2012-09-24 30 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) 
     { 
      ... 
     } 
    } 
} 

我用于单元测试的具体类;

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

我的单元测试;

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); 
} 

这是不可能的,因为PeekCompletedEventArgs没有默认构造函数。

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); 
} 

这看起来不错,但调用execute时,我得到一个错误说类型的对象“‘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); 

注:事实上,sendernull会导致一个NullReferenceException当您访问Message属性。

+0

是的,当然,非常感谢 – Per

相关问题