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

Я пытаюсь следовать предложениям из Использование диспетчера 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? Кажется, это лучший метод для обработки диспетчера, а не ожидания обратных вызовов от модели представления.

7
задан Community 23 May 2017 в 11:54
поделиться