Как протестировать, написать 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();
Строго говоря, юнит-тесты для такого кода не написать. Потому что юнит-тесты по определению не должны зависеть от внешнего окружения (в данном случае сети). Как в таком случае поступить?
Во-первых, нужно выделить код общения с 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);
Во-вторых, поскольку наш новый класс содержит минимальное количество тривиального кода, то можно не писать на него тесты, а обойтись парой ручных проверок. Если же тесты написать все-таки хочется, но нужно будет писать полноценные интеграционные тесты с задействованием сети и созданием тестового клиента.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Вот решил перейти с С++ на С# и наткнулся на такую проблемуКак я понял, в шарпе нет шаблонов как таковых, и это компенсируется интерфейсами...