メッセージキューのピークが完了したときに呼び出されるコールバックメソッドを単体テストしたいのですが、これを行う方法がわかりません。
私の抽象クラス。
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を処理する必要がありません。私がそこまで到達するなら。