Silverlight 如何测试我的回调是否从事件调用?
我有以下方法签名:Silverlight 如何测试我的回调是否从事件调用?,silverlight,unit-testing,tdd,nunit,moq,Silverlight,Unit Testing,Tdd,Nunit,Moq,我有以下方法签名: IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) 回调与已完成事件挂钩,如下所示: public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { Sock
IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
回调与已完成事件挂钩,如下所示:
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
{
SocketAsyncEventArgs args = new SocketAsyncEventArgs()
WriteAsyncResult ar = new WriteAsyncResult();
ar.Callback = callback;
args.UserToken = ar;
// ...
if (callback != null)
args.Completed += OnSendAsyncComplete;
// ...
socket.SendAsync(args);
// ...
}
private void OnSendAsyncComplete(object sender, SocketAsyncEventArgs e)
{
var ar = e.UserToken as WriteAsyncResult;
ar.Callback(ar);
}
如何测试每当args.Completed事件被引发时,回调是否被调用。我知道我必须自己引发它,但如何测试我的回调是否被调用?假设您可以找到一种方法自己引发已完成的事件(可能使用额外的抽象层),您可以这样做: 一种简单的方法是将异步回调放在一个名为CallbackCalled的属性的小类中。调用回调时,将此属性设置为true
在测试中,调用BeginWrite,从类的实例传递回调方法,然后手动引发事件,并断言在此之后CallbackCalled属性为true。我可以引发已完成的事件,因为我正在模拟SendAsync方法。我的问题是,我不能模拟套接字事件参数,因为这是一个实现细节。我正在寻找一些我可以通过模拟套接字来验证的东西。你是说你不能模拟SocketAsyncEventArgs,对吗?这就是我所说的使用额外的抽象层的意思。将处理已完成事件的逻辑封装在单独的类中,该类将引发自己的事件。您可以在单独的类中模拟该事件,而未经测试的代码只是事件处理程序的代码(由于实现非常简单,所以失败的可能性要小得多)。所以您的意思是,我应该有一个实用程序类,它接受SocketAsyncEventArgs进行BeginWrite?哦,等等,我的代码不正确。现在代码将编译。完成的事件将引发实现详细信息。我只需要检查一下我的回拨是否被调用。最终我在你的建议下做了一些聪明的事情。非常感谢。