我通过将 Dispatcher 包装在自己的 IDispatcher 接口中来完成此操作,然后使用 Moq 来验证对它的调用是否已完成。
IDispatcher 接口:
public interface IDispatcher
{
void BeginInvoke(Delegate action, params object[] args);
}
真正的调度器实现:
class RealDispatcher : IDispatcher
{
private readonly Dispatcher _dispatcher;
public RealDispatcher(Dispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public void BeginInvoke(Delegate method, params object[] args)
{
_dispatcher.BeginInvoke(method, args);
}
}
在您的测试类中初始化调度程序:
public ClassUnderTest(IDispatcher dispatcher = null)
{
_dispatcher = dispatcher ?? new UiDispatcher(Application.Current?.Dispatcher);
}
在单元测试中模拟调度程序(在这种情况下,我的事件处理程序是 OnMyEventHandler 并接受一个名为 myBoolParameter 的布尔参数)
[Test]
public void When_DoSomething_Then_InvokeMyEventHandler()
{
var dispatcher = new Mock<IDispatcher>();
ClassUnderTest classUnderTest = new ClassUnderTest(dispatcher.Object);
Action<bool> OnMyEventHanlder = delegate (bool myBoolParameter) { };
classUnderTest.OnMyEvent += OnMyEventHanlder;
classUnderTest.DoSomething();
//verify that OnMyEventHandler is invoked with 'false' argument passed in
dispatcher.Verify(p => p.BeginInvoke(OnMyEventHanlder, false), Times.Once);
}