C#Asyn.套接字编程

5 .net sockets asp.net unit-testing

是否有可能对Asyn进行单元测试.套接字编程(使用c#)?提供一些样本单元测试代码.

Wim*_*nen 9

我假设您正在测试您自己的一些使用 .NET 流的类;让我们称之为MessageSender。请注意,没有理由对 .NET 流本身进行单元测试,这是 Microsoft 的工作。您不应该对 .NET 框架代码进行单元测试,而应该对您自己的代码进行单元测试。

首先,确保您注入MessageSender. 不要在类中创建它,而是接受它作为属性值或构造函数参数。例如:

public sealed class MessageSender
{
   private readonly Stream stream;

   public MessageSender(Stream stream)
   {
      if (stream == null)
         throw new ArgumentNullException("stream");
      this.stream = stream;
   }

   public IAsyncResult BeginSendHello(AsyncCallback callback, object state)
   {
      byte[] message = new byte[] {0x01, 0x02, 0x03};
      return this.stream.BeginWrite(
         message, 0, message.Length, callback, state);
   }

   public void EndSendHello(IAsyncResult asyncResult)
   {
      this.stream.EndWrite(asyncResult);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在是一个示例测试:您可以测试对流的BeginSendHello调用BeginWrite,并发送正确的字节。我们将模拟流并设置一个期望来验证这一点。我在这个例子中使用了RhinoMocks框架。

[Test]
public void BeginSendHelloInvokesBeginWriteWithCorrectBytes()
{
   var mocks = new MockRepository();
   var stream = mocks.StrictMock<Stream>();
   Expect.Call(stream.BeginWrite(
      new byte[] {0x01, 0x02, 0x03}, 0, 3, null, null));
   mocks.ReplayAll();

   var messageSender = new MessageSender(stream);
   messageSender.BeginSendHello(null, null);

   mocks.VerifyAll();
}
Run Code Online (Sandbox Code Playgroud)