C # Asyn. Программирование сокетов - PullRequest
5 голосов
/ 14 сентября 2009

Возможно ли модульное тестирование Asyn. программирование сокетов (используя c #)? Укажите пример кода тестового модуля.

1 Ответ

4 голосов
/ 14 сентября 2009

Я предполагаю, что вы тестируете какой-то собственный класс, использующий потоки .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);
   }
}

Теперь пример теста: вы можете проверить, что 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...