Pad*_*oti 12 c# tdd events asynchronous
基本问题是如何创建需要调用方法的单元测试,等待测试类上的事件发生,然后调用另一个方法(我们实际想要测试的方法)?
如果您有时间进一步阅读,这是场景:
我正在开发一个必须控制硬件的应用程序.为了避免硬件可用性的依赖性,当我创建对象时,我指定我们在测试模式下运行.当发生这种情况时,正在测试的类会创建适当的驱动程序层次结构(在这种情况下是一个精简的模拟硬件驱动程序层).
想象一下,所讨论的课程是电梯,我想测试给出电梯所在楼层号的方法.以下是我的虚拟测试现在的样子:
[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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
感谢所有的答案.这就是我最终实现它的方式:
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为你已经走上了正确的道路.测试需要等到事件发生或你判断它已经花了太长时间才到达并且应该放弃等待.
为此,您可以在测试中使用Monitor.Wait超时,并在事件到达时使用Monitor.Pulse发出信号.
[TestMethod]
public void TestGetCurrentFloor()
{
var elevator = new Elevator(Elevator.Environment.Offline);
elevator.ElevatorArrivedOnFloor += TestElevatorArrived;
lock (this)
{
elevator.GoToFloor(5); // NOTE: this must hand off to a second thread, and the ElevatorArrivedOnFloor must be raised by this other thread otherwise the Monitor will be pulse before we've started waiting for it
if (!Monitor.Wait(this, TIMEOUT)) Assert.Fail("Event did not arrive in time.");
}
int floor = elevator.GetCurrentFloor();
Assert.AreEqual(floor, 5);
}
private void TestElevatorArrived(int floor)
{
lock (this)
{
Monitor.Pulse(this);
}
}
(Assert.Fail()此处的调用应替换为您的单元测试工具用于显式地使测试失败的任何机制 - 或者您可以抛出异常.)
| 归档时间: |
|
| 查看次数: |
1939 次 |
| 最近记录: |