Правильный метод использования диспетчера WPF в модульных тестахC#

Место общения программистов C#
Anonymous
Правильный метод использования диспетчера WPF в модульных тестах

Сообщение Anonymous »

Я пытаюсь следовать рекомендациям из статьи «Использование диспетчера WPF в модульных тестах», чтобы запустить тест nUnit.

Когда я пишу свой модульный тест, как показано ниже, он работает:

Код: Выделить всё

[Test]
public void Data_Should_Contain_Items()
{
DispatcherFrame frame = new DispatcherFrame();
PropertyChangedEventHandler waitForModelHandler = delegate(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Data")
{
frame.Continue = false;
}
};
_myViewModel.PropertyChanged += waitForModelHandler;
Dispatcher.PushFrame(frame);

Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
Однако, если я попытаюсь использовать предложение DispatcherUtil, это не сработает:

Код: Выделить всё

[Test]
public void Data_Should_Contain_Items()
{
DispatcherUtil.DoEvents();
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}

public static class DispatcherUtil
{
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}

private static object ExitFrame(object frame)
{
((DispatcherFrame)frame).Continue = false;
return null;
}
}
Когда я использую DispatcherUtil, похоже, что вызов ExitFrame происходит слишком рано, прежде чем данные будут готовы.

Разве я неправильно использую DispatcherUtil? Кажется, это лучший метод для работы с диспетчером, а не для ожидания обратных вызовов из модели представления.

Вернуться в «C#»