Основной вопрос: каким образом я могу создать unit test, который должен вызвать метод, дождаться, когда событие произойдет в тестируемом классе, а затем вызвать другой метод (тот, который мы действительно хотим проверить)?
Здесь сценарий, если у вас есть время для дальнейшего чтения:
Я разрабатываю приложение, которое должно контролировать часть оборудования. Чтобы избежать зависимости от доступности оборудования, когда я создаю свой объект, я указываю, что мы работаем в тестовом режиме. Когда это произойдет, тестируемый класс создает соответствующую иерархию драйверов (в данном случае тонкий макет уровня драйверов оборудования).
Представьте себе, что класс, о котором идет речь, является Лифт, и я хочу проверить метод, который дает мне номер пола, который является лифтом. Вот как выглядит мой фиктивный тест прямо сейчас:
[TestMethod]
public void TestGetCurrentFloor()
{
var elevator = new Elevator(Elevator.Environment.Offline);
elevator.ElevatorArrivedOnFloor += TestElevatorArrived;
elevator.GoToFloor(5);
//Here where I'm getting lost... I could block
//until TestElevatorArrived gives me a signal, but
//I'm not sure it 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);
}
}