Фундаментальный вопрос: как создать модульный тест, который должен вызывать метод, дождаться события, произошедшего в тестируемом классе, а затем вызвать другой метод (тот, который мы действительно хотим протестировать)?
Вот сценарий, если у вас есть время, чтобы прочитать дальше:
Я разрабатываю приложение, которое должно контролировать аппаратную часть. Чтобы избежать зависимости от доступности оборудования, при создании объекта я указываю, что мы работаем в тестовом режиме. Когда это происходит, класс, который тестируется, создает соответствующую иерархию драйверов (в данном случае тонкий ложный слой драйверов оборудования).
Представьте, что рассматриваемый класс является лифтом, и я хочу проверить метод, который дает мне номер этажа, которым является лифт. Вот как выглядит мой фиктивный тест прямо сейчас:
[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);
}
}