Я использую библиотеку приложений Prism/Composite и пытаюсь протестировать некоторый код, который подписывается на CompositePresentationEvent, используя EventAggregator. Код, вызывающий событие, вызывает его в другом потоке, поэтому я подписываюсь на событие с помощью ThreadOption.UIThread.
Когда событие вызывает обратный вызов, оно использует диспетчер приложений, чтобы поместить его в поток пользовательского интерфейса. Это нормально во время обычного выполнения, но во время модульного теста диспетчера нет. Код в CompositePresentationEvent выглядит так:
private IDispatcherFacade UIDispatcher
{
get
{
if (uiDispatcher == null)
{
this.uiDispatcher = new DefaultDispatcher();
}
return uiDispatcher;
}
}
public class DefaultDispatcher : IDispatcherFacade
{
/// <summary>
/// Forwards the BeginInvoke to the current application's <see cref="Dispatcher"/>.
/// </summary>
/// <param name="method">Method to be invoked.</param>
/// <param name="arg">Arguments to pass to the invoked method.</param>
public void BeginInvoke(Delegate method, object arg)
{
if (Application.Current != null)
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, method, arg);
}
}
}
Проблема в том, что CompositePresentationEvent привязан к DefaultDispatcher, и этот диспетчер ничего не делает, если приложение не запущено.
У кого-нибудь было успешное модульное тестирование в такой ситуации? Любые советы или обходные пути, чтобы оживить диспетчера?
Я знаю, что могу сделать свой обратный вызов внутренним и позволить моему модульному тесту вызывать этот метод, но я бы предпочел не менять свой код и оставить этот подход в крайнем случае.
CompositePresentationEvent
), то введение реального экземпляраCompositePresentationEvent
в ваш тест делает их немодульными. Может быть, вместо того, чтобы играть с CPE, вам следует изолировать от него свой класс, а затем использовать mocks/stubs? - person Snowbear   schedule 28.01.2011