Я выполнил это, поместив 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 и принимает один параметр bool, называемый 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);
}