4

メッセージキューのピークが完了したときに呼び出されるコールバックメソッドを単体テストしたいのですが、これを行う方法がわかりません。

私の抽象クラス。

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を処理する必要がありません。私がそこまで到達するなら。

4

1 に答える 1

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

注:プロパティにアクセスすると、NullReferenceExceptionが発生しsenderます。nullMessage

于 2012-09-24T10:07:42.720 に答える