2010-03-16 8 views
6

Quiero probar una aplicación que representa un bloque de texto con un valor de campo de datos. Me gustaría obtener el ancho real y la altura real, una vez que se complete el renderizado. Todo funciona bien El problema vino primero, cuando traté de probar la aplicación. No puedo invocar al despachador desde el proyecto de prueba.¿Cómo invocar WPF Dispatcher en Nunit?

A continuación se muestra el código.

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. 
      } 
     )); 
}; 

Acabo de empezar a utilizar la NUnit. Entonces, por favor ayudame

Gracias

Respuesta

1

No he usado nUnit para escribir pruebas unitarias antes, pero este es un problema común con las pruebas de la unidad VS. Lo que puede terminar sucediendo es que cada prueba utiliza un despachador diferente y WPF requiere que use el mismo despachador. Para evitar esto, crea una clase estática para almacenar en caché el Dispatcher y luego invocar todo a través de él.

+0

Exactamente, lo que estaba buscando. Gracias steven genial :) –

2

Es posible que desee mirar a http://www.codeproject.com/KB/WPF/UnitTestDispatcherTimer.aspx Se trata de un DispatcherTimer en WPF y NUnit que a su vez utiliza el Dispatcher.

Editar

Desde el enlace de tratar de hacer esto antes de la prueba:

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

Y detenerlo después de la prueba.

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); 
+0

Hola, cornelius, gracias por el enlace. No pude entender. Por favor, dame más detalles sobre cómo el dispatcherrterme ayudó en este escenario. –

+0

No creo que deba usar el DispatcherTimer, pero el enlace describe el problema al utilizar el temporizador que está relacionado con el Dispatcher fuera de un proyecto de WPF similar a lo que está tratando de hacer – Cornelius

Cuestiones relacionadas