Как создать единичный тест для тестирования класса, который находится в цикле?Асинхронные TDD - блоки тестового класса
Вот сценарий.
У меня есть класс, которому вводят ссылку на последовательный порт.
Класс имеет метод Send (String data);
Этот общедоступный метод вызывает асинхронный частный метод для выполнения фактической работы.
Испытание класса (CUT) должно выполняться следующим образом при вызове этого метода.
1) Разделите строку на символы.
2) отправить символ
3) ждать полукокса быть эхо
4) посылают следующий символ (повторить, пока все символы не послали)
Таким образом, после отправки первого полукокса вырезанные будут сидеть в цикле ожидая эха, пока он не получит один или не выйдет.
Проблема, которая возникает после того, как CUT вошел в этот цикл, он заблокирует тестовый класс, пока не истечет время.
Поскольку мне нужен тестовый класс для отправки эха на CUT im stuck.
Чтобы проверить это, я создал mock последовательный порт и im, используя NUnit.
Тест представлен ниже. Идея состоит в том, что после отправки тестовой строки я жду ответа CUT. Каждый раз, когда CUT записывает символ на последовательный порт, ожидание отменяется, и я пишу эхо в последовательный порт, и CUT отвечает на это, отправив следующий символ.
[Test]
public void Test()
{
_serialPort.DataSentEvent += new EventHandler(_serialPort_DataSentEvent);
_completedSync = new ManualResetEvent(false);
_wrapperPort.Send("TEST");
_completedSync.WaitOne(1000); // wait for first char
Assert.AreEqual("T", _serialPort.BufferOUT); //first char sent
_serialPort.BufferIN = "T"; //write the echo
_completedSync.WaitOne(1000); //wait for second char
Assert.AreEqual("E", _serialPort.BufferOUT); //second char sent
//...etc
}
void _serialPort_DataSentEvent(object sender, EventArgs e)
{
_completedSync.Set();
}
Но что происходит, вырезанными блоки, как только Send («TEST») называется и контролировать только возвращается в тестовом классе после того, как CUT истекло время ожидания эхо.
Поскольку метод отправки завершается в другом потоке, почему он блокирует тестовый класс?
было бы неплохо увидеть код 'CUT' – Gutzofter