2011-02-02 3 views
0

Мне нужно создать интеграционный тест, который демонстрирует успешную отправку пакета UDP на удаленную часть программного обеспечения. Удаленное программное обеспечение недоступно в тестовой среде (это устаревшая, но все еще поддерживаемая версия) и не под моим контролем, поэтому я подумал, что настрою тест, который, по крайней мере, докажет, что команда выходит так, как ожидалось. После прочтения this question's answers, я настроил свой код следующим образом:Интеграционное тестирование алгоритма UDP

public void TestRemoteCommand() 
    { 
     //A "strategy picker"; will instantiate a version-specific 
     //implementation, using a UdpClient in this case 
     var communicator = new NotifyCommunicator(IPAddress.Loopback.ToString(), "1.0"); 
     const string message = "REMOTE COMMAND"; 
     const int port = <specific port the actual remote software listens on>; 
     var receivingEndpoint = new IPEndPoint(IPAddress.Loopback, port); 

     //my test listener; will listen on the same port already connected to by 
     //the communicator's UdpClient (set up without sharing) 
     var client = new UdpClient(); 
     client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     client.Client.Bind(receivingEndpoint); 

     //Results in the UDP diagram being sent 
     communicator.SendRemoteCommand(); 

     //This assertion always fails 
     Assert.IsTrue(client.Available > 0); 
     var result = client.Receive(ref receivingEndpoint); 

     Assert.AreEqual(result.Select(b => (char)b).ToArray(), message.ToCharArray()); 
    } 

Однако, это не работает, как в комментарии выше. Кто-нибудь видит, что мне здесь не хватает?

ответ

0

Утверждение происходит слишком быстро. Вы отправляете данные и мгновенно проверяете получение данных. Он всегда будет терпеть неудачу, так как время в оба конца для клиента и обратно намного больше, чем наносекунды, которые требуется вашей программе для выполнения следующей строки. Поместите оператор ожидания где-нибудь или создайте цикл while для проверки данных, спящий режим в течение нескольких мс, а затем снова проверьте.

+0

Это оказалось его частью. Я еще немного забрался в него и обнаружил, что у меня он прослушивается на всех портах, а не на конкретном порту, который не работал. Но да, я также должен был добавить быстрый оператор Thread.Sleep(), чтобы убедиться, что пакет прошел через аппаратный уровень в принимающий ковш. На самом деле он работал нормально, работая по одному тесту за раз, но он не удался в наборе. – KeithS

 Смежные вопросы

  • Нет связанных вопросов^_^