Как вызвать WPF Dispatcher в Nunit? - PullRequest
6 голосов
/ 16 марта 2010

Я хочу протестировать приложение, которое отображает текстовый блок со значением поля данных. Я хотел бы получить фактическую ширину и фактическую высоту после завершения рендеринга. Все отлично работает Проблема появилась в первую очередь, когда я попытался протестировать приложение. Я не могу вызвать диспетчера из тестового проекта.

Ниже приведен код.

this.Loaded += (s, e) =>
{
    TextBlock textBlock1 = new TextBlock();

    //// Text block value is assigned from data base field.
    textBlock1.Text = strValueFromDataBaseField;        
    //// Setting the wrap behavior.
    textBlock1.TextWrapping = TextWrapping.WrapWithOverflow;
    //// Adding the text block to the layout canvas.
    this.layoutCanvas.Children.Add(textBlock1);

    this.Dispatcher.BeginInvoke(DispatcherPriority.Background,
        (Action)(() =>
            {
                //// After rendering the text block with the data base field value. Measuring the actual width and height.
               this.TextBlockActualWidth = textBlock1.ActualWidth;
               this.TextBlockActualHeight = textBlock1.ActualHeight;

               //// Other calculations based on the actual widht and actual height.
            }
        ));
};

Я только начал использовать NUnit. Так что, пожалуйста, помогите мне.

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 марта 2010

Возможно, вы захотите взглянуть на http://www.codeproject.com/KB/WPF/UnitTestDispatcherTimer.aspx Он имеет дело с DispatcherTimer в WPF и NUnit, который в свою очередь использует Dispatcher.

Редактировать

По ссылке попробуйте сделать это до теста:

Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, testMethod);
// Start the worker thread's message pump
Dispatcher.Run();  // This will block until the dispatcher is shutdown

И останови его после теста.

Dispatcher disp = Dispatcher.CurrentDispatcher;
// Kill the worker thread's Dispatcher so that the
// message pump is shut down and the thread can die.
disp.BeginInvokeShutdown(DispatcherPriority.Normal);
1 голос
/ 10 июня 2010

Я не использовал nUnit для написания модульных тестов раньше, но это общая проблема с модульными тестами VS. В конечном итоге может случиться, что в каждом тесте используется другой диспетчер, а WPF требует, чтобы вы использовали один и тот же диспетчер. Чтобы обойти это, создайте статический класс для кэширования Dispatcher, а затем вызовите все через него.

...