Основной вопрос заключается в том, как создать единичный тест, которому необходимо вызвать метод, дождаться события, которое произойдет в тестируемом классе, а затем вызвать другой метод (тот, который мы действительно хотим проверить)?Как TDD асинхронные события?
Вот сценарий, если у вас есть время, чтобы прочитать дальше:
Я разрабатываю приложение, которое должно контролировать часть оборудования. Чтобы избежать зависимости от доступности оборудования, когда я создаю свой объект, я указываю, что мы работаем в тестовом режиме. Когда это происходит, тестируемый класс создает соответствующую иерархию драйверов (в данном случае тонкий макет уровня драйверов оборудования).
Представьте, что класс, о котором идет речь, является Лифт, и я хочу проверить метод, который дает мне номер пола, который находится на лифте. Вот как мой фиктивный тест выглядит как прямо сейчас:
[TestMethod]
public void TestGetCurrentFloor()
{
var elevator = new Elevator(Elevator.Environment.Offline);
elevator.ElevatorArrivedOnFloor += TestElevatorArrived;
elevator.GoToFloor(5);
//Here's where I'm getting lost... I could block
//until TestElevatorArrived gives me a signal, but
//I'm not sure it's the best way
int floor = elevator.GetCurrentFloor();
Assert.AreEqual(floor, 5);
}
Edit:
Спасибо за все ответы. Вот как я это сделал:
[TestMethod]
public void TestGetCurrentFloor()
{
var elevator = new Elevator(Elevator.Environment.Offline);
elevator.ElevatorArrivedOnFloor += (s, e) => { Monitor.Pulse(this); };
lock (this)
{
elevator.GoToFloor(5);
if (!Monitor.Wait(this, Timeout))
Assert.Fail("Elevator did not reach destination in time");
int floor = elevator.GetCurrentFloor();
Assert.AreEqual(floor, 5);
}
}
Будут ли блокировки вызовов на целевой ОС? –
№ Как только вы вызываете .GoToFloor (пол), он возвращается, но лифт меняет статус на «Перемещение», занимает некоторое время, чтобы добраться до этого этажа, а затем он поднимет событие (которое может быть в другом потоке) –
Привет, это должно решить проблему, которую я испытываю асинхронную операцию. Я использовал ваш код выше в качестве отправной точки, однако Monitor.Pulse не вызывает Wait для повторной фиксации блокировки, и это время, из-за которого загорается Assert.Fail («Событие не пришло»). Любые идеи, почему это может быть ...!? – Kildareflare