如何创建一个单元测试,需要调用一个方法,等待被测试类上的某个事件发生,然后再调用另一个方法(我们真正想要测试的方法)是一个基本问题。
以下是一个情景描述:
我正在开发一个必须控制硬件的应用程序。为了避免依赖于硬件可用性,在创建对象时我指定了运行在测试模式下。这样做时,被测试的类会创建适当的驱动程序层次结构(在这种情况下是一个薄的模拟硬件驱动程序层)。
假设被测试的类是电梯,我想要测试的方法是返回电梯所在楼层数的方法。现在,我的虚构测试案例看起来像这样:
[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);
}
编辑:
感谢所有的回答,以下是我最终采用的实现方式:
[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);
}
}
lock
。 - Paul Ruane