Я работаю над частью сетевого кода, который прослушивает TCP-соединение, анализирует входящие данные и вызывает соответствующее событие.Естественно, чтобы избежать блокировки остальной части приложения, прослушивание и анализ выполняются в фоновом режиме.При попытке выполнить модульное тестирование этого кода я столкнулся с проблемой, заключающейся в том, что, поскольку в сетевом коде нужно выполнить больше работы, чем в модульном тесте, модульное тестирование завершается до того, как у адаптера появится возможность вызвать событие, и поэтому тест не пройден.
Класс адаптера:
public class NetworkAdapter : NetworkAdapterBase //NetworkAdapterBase is just an abstract base class with event definitions and protected Raise... methods.
{
//Fields removed for brevity.
public NetworkAdapter(TcpClient tcpClient)
{
_tcpConnection = tcpClient;
//Hook up event handlers for background worker.
NetworkWorker.DoWork += NetworkWorker_DoWork;
if (IsConnected)
{
//Start up background worker.
NetworkWorker.RunWorkerAsync();
}
}
private void NetworkWorker_DoWork(object sender, DoWorkEventArgs e)
{
while (IsConnected)
{
//Listen for incoming data, parse, raise events...
}
}
}
Попытка проверки кода:
[TestMethod]
public void _processes_network_data()
{
bool newConfigurationReceived = false;
var adapter = new NetworkAdapter(TestClient); //TestClient is just a TcpClient that is set up in a [TestInitialize] method.
adapter.ConfigurationDataReceived += (sender, config) =>
{
newConfigurationReceived = true;
};
//Send fake byte packets to TestClient.
Assert.IsTrue(newConfigurationReceived, "Results: Event not raised.");
}
Как мне попытаться протестировать такого рода вещи?
Спасибо,
Джеймс