Как выполнить модульное тестирование сетевых подключений? - PullRequest
4 голосов
/ 16 декабря 2011

Я хочу провести модульное тестирование кода ниже. Я работал с MSTest и пытался выучить Microsoft Moles и RhinoMocks . Но я не мог заставить никого из них помочь мне. Я знаю, что могу радикально изменить код, чтобы использовать интерфейсы, делающие его более тестируемым, но для этого потребовалось бы программировать интерфейсы и реализации, инкапсулирующие TcpClient, NetworkStream, StreamWriter и StreamReader.

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

using (TcpClient tcpClient = new TcpClient(hostName, port))
using (NetworkStream stream = tcpClient.GetStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
{
    writer.AutoFlush = true;
    writer.Write(message);
    return reader.ReadLine();
}

1 Ответ

11 голосов
/ 16 декабря 2011

Сохраняйте это простым.

Абстрагируйтесь от сетевого уровня.Я обычно использую интерфейс, который называется что-то вроде INetworkChannel, который выглядит примерно так:

public interface INetworkChannel : IDisposable
{
    void Connect(IPEndPoint remoteEndPoint);
    void Send(byte[] buffer, int offset, int count);

    public event EventHandler Disconnected;
    public event EventHandler<ReceivedEventArgs> Received;
}

Это позволяет легко протестировать все, и вы можете создать SecureNetworkChannel класс, который использует SslStream или FastNetworkChannelкоторый использует новые методы Async.

Детали, например, какой поток используется или если вы используете TcpClient или Socket, не должны иметь значения для остальной части приложения.

Редактировать

Тестирование реализации INetworkingChannel также легко, поскольку теперь у вас есть класс с очень четкой ответственностью.Я создаю соединение с моими реализациями, чтобы проверить их.Пусть TcpListener прослушивает порт 0, чтобы ОС могла назначить свободный порт.

Я просто проверяю, правильно ли он обрабатывает отправку и получает, и правильно ли он выполняет очистку при закрытии / разрыве соединения.

...