C# 单元测试完成peek时使用的异步回调方法
我希望对一个回调方法进行单元测试,该方法在完成对messagequeue的查看时调用,但不知道如何执行 我的抽象类C# 单元测试完成peek时使用的异步回调方法,c#,moq,mstest,msmq,C#,Moq,Mstest,Msmq,我希望对一个回调方法进行单元测试,该方法在完成对messagequeue的查看时调用,但不知道如何执行 我的抽象类 public abstract class QueueHandler : WindowsServiceBase { private readonly IMessageQueueWrapper _listeningQueue; private PeekCompletedEventHandler _peekHandler; protected QueueHan
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);
}
这看起来不错,但在调用execute时,我收到一个错误,即类型为“System.EventArgs”的对象无法转换为类型为“System.Messaging.PeekCompletedEventArgs”。。。如果我能做到这一点,我没有任何异步结果需要考虑。您可以使用内部构造函数创建一个实例:
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
为null
这一事实将导致在访问消息
属性时出现NullReferenceException
MessageQueue sender = null;
IAsyncResult result = null;
var e = Activator.CreateInstance(typeof(System.Messaging.PeekCompletedEventArgs),
BindingFlags.NonPublic | BindingFlags.Instance,
null, new object[]{sender, result}, null);