Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何测试我的回调是否从事件调用?_Silverlight_Unit Testing_Tdd_Nunit_Moq - Fatal编程技术网

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?哦,等等,我的代码不正确。现在代码将编译。完成的事件将引发实现详细信息。我只需要检查一下我的回拨是否被调用。最终我在你的建议下做了一些聪明的事情。非常感谢。