如何解决有没有一种方法可以检查在单元测试中是否调用了EventWaitHandle的set方法?
| 我尝试使用模拟框架(Moq),但由于Set是不可覆盖的方法,因此无法正常工作。然后,我愚蠢地尝试通过扩展类来制作自己的EventWaitHandle。似乎没有什么可以挂钩任何代码来检测set是否确实被调用的点。 我想做一些类似于Timer.Dispose(WaitHandle notifyObject)的事情,其中有人可以传递一个等待句柄,当事情完成时我将调用set。 我宁愿这样做而不必创建包装器类。似乎双方都付出了很多额外的努力和工作,我和需要使用我的课程来创建包装器的人。解决方法
不幸的是,这是不可能的。但是,您的做法是正确的-模拟代码的多线程方面,允许测试运行单线程。然后测试验证是否调用了正确的方法(在这种情况下为
Set
)。
我希望.NET框架在设计时考虑到测试的更多内容,允许我们通过让类实现一个简单的接口来模拟这种方法。
我一直在使用这种确切的方法以及缺少接口的其他方法处于相同的情况。最后我结束了要么A)写一个包装器B)不写一个测试。
,它不理想,但是另一种方法是创建单独的任务以测试是否执行了“设置”调用,一个任务执行实际工作,另一个任务阻塞WaitHandle。然后,测试成为等待两个任务完成的情况(显然是增加了超时以防止永远等待!)。
一个非常粗糙的示例如下:
[Test]
public void Test_Blocking()
{
// Arrange
var ewh = new EventWaitHandle(false,EventResetMode.ManualReset);
System.Threading.Tasks.Task<int> blocker = BlockOn(ewh,0);
// Act
System.Threading.Tasks.Task worker = Work(ewh);
var allTasks = new[] { worker,blocker };
while (!allTasks.All(t => t.IsCompleted))
{
// spin
}
// Assert
Assert.That(blocker.Result,Is.EqualTo(1));
}
private static System.Threading.Tasks.Task<int> BlockOn(EventWaitHandle waitHandle,int counter)
{
return System.Threading.Tasks.Task.Factory.StartNew<int>(() =>
{
waitHandle.WaitOne();
return counter + 1;
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。