有没有一种方法可以检查在单元测试中是否调用了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;
        });
    }
    

要回复问题请先登录注册