【问题标题】:How to test that my callback is called from an event?如何测试我的回调是从事件中调用的?
【发布时间】:2011-05-06 12:40:21
【问题描述】:

我有以下方法签名:

IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)

回调被挂接到 Completed 事件中,如下所示:

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 事件引发时被调用。
我知道我必须自己提高它,但我如何测试我的回调是否被调用?

【问题讨论】:

    标签: silverlight unit-testing tdd nunit moq


    【解决方案1】:

    假设您可以自己找到一种方法来引发已完成的事件(可能使用额外的抽象层),您可以执行以下操作:

    一种简单的方法是在一个小类中使用名为 CallbackCalled 的属性来实现异步回调。调用回调时,将此属性设置为 true。

    在您的测试中,您调用 BeginWrite 从类的实例传递回调方法,然后手动引发事件并断言 CallbackCalled 属性为 true。

    【讨论】:

    • 我可以引发 Completed 事件,因为我在模拟 SendAsync 方法。我的问题是我不能模拟套接字事件参数,因为它是一个实现细节。我正在寻找可以通过模拟套接字来验证的东西。
    • 你的意思是你不能模拟 SocketAsyncEventArgs 对吧?这就是我使用额外的抽象层的意思。将处理完成事件的逻辑封装在一个单独的类中,该类会引发自己的事件。您将能够在该单独的类中模拟该事件,并且未经测试的代码只是事件处理程序的代码(由于实现很简单,因此失败的可能性要小得多)。
    • 所以你的意思是我应该有一个实用程序类,它接受用于 BeginWrite 的 SocketAsyncEventArgs?哦等等,我的代码不正确。
    • 现在代码将被编译。 Completed 事件引发了一个实现细节。我只需要检查我的回调是否被调用。
    • 最终我根据您的建议做了一些聪明的事情。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2012-03-06
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多