Unit Test UDP sender

353
09 декабря 2016, 08:59

Как протестировать, написать unit test для UDP sender? Код:

byte[] number = Encoding.ASCII.GetBytes(numb.ToString());
UdpClient udpclient = new UdpClient();
IPAddress multicastaddress = IPAddress.Parse(_instance.configuration.ip);
udpclient.JoinMulticastGroup(multicastaddress);
IPEndPoint remoteep = new IPEndPoint(multicastaddress, _instance.configuration.port);
udpclient.Send(number, number.Length, remoteep);
udpclient.Close();
Answer 1

Строго говоря, юнит-тесты для такого кода не написать. Потому что юнит-тесты по определению не должны зависеть от внешнего окружения (в данном случае сети). Как в таком случае поступить?

Во-первых, нужно выделить код общения с UDP в отдельный класс, которым будет пользоваться более высокоуровневый код. При этом данный класс должен содержать как можно меньше логики и заниматься только UDP отправкой. Например, логика получения массива байт и IPAddress должна быть вынесена из него. Это позволит протестировать максимальное количество кода именно юнит-тестами, без задействования сети. Пример:

public class UDPSender
{
    public void Send(byte[] data, IPAddress address, int port)
    {
        UdpClient udpclient = new UdpClient();
        udpclient.JoinMulticastGroup(address);
        IPEndPoint remoteep = new IPEndPoint(address, port);
        udpclient.Send(data, data.Length, remoteep);
        udpclient.Close();
    }
}
...
byte[] number = Encoding.ASCII.GetBytes(numb.ToString());
IPAddress multicastaddress = IPAddress.Parse(_instance.configuration.ip);
var sender = new UDPSender();
sender.Send(number, multicasaddress, _instance.configuration.port);

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

READ ALSO
c# Unit tests написать в лог

c# Unit tests написать в лог

Как писать в окно отладки в юнит тестировании?

460
Реализация Матрицы C#

Реализация Матрицы C#

Вот решил перейти с С++ на С# и наткнулся на такую проблемуКак я понял, в шарпе нет шаблонов как таковых, и это компенсируется интерфейсами...

458