2010-03-16 7 views
6

Voglio testare un'applicazione che esegue il rendering di un blocco di testo con un valore del campo dati. Mi piacerebbe ottenere la larghezza effettiva e l'altezza effettiva, una volta completato il rendering. Tutto funziona bene Il problema è venuto prima, quando ho provato a testare l'applicazione. Non riesco a richiamare il dispatcher dal progetto di test.Come richiamare il Dispatcher WPF in Nunit?

Di seguito è riportato il codice.

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

Ho appena iniziato a utilizzare il NUnit. Quindi, per favore aiutami.

Grazie

risposta

1

non hanno utilizzato NUnit per scrivere unit test prima, ma questo è un problema comune con test di unità VS. Quello che può succedere è che ogni test utilizza un dispatcher diverso e WPF richiede che tu usi lo stesso dispatcher. Per aggirare questo, creare una classe statica per mettere in cache il Dispatcher e quindi richiamare tutto attraverso di esso.

+0

Esattamente, quello che stavo cercando. Grazie steven fantastico :) –

2

Si potrebbe desiderare di guardare http://www.codeproject.com/KB/WPF/UnitTestDispatcherTimer.aspx Si tratta di una DispatcherTimer in WPF e NUnit che a sua volta utilizza il Dispatcher.

Modifica

Dal link cercare di fare questo prima della prova:

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

E fermarlo dopo il test.

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

Ciao cornelius, grazie per il link. Non ho potuto capire Potete per favore, darmi qualche dettaglio in più su come dispatchertimer è utile in questo scenario. –

+0

Non penso che dovresti usare DispatcherTimer ma il collegamento descrive il problema nell'usare il timer che è correlato al Dispatcher al di fuori di un progetto WPF simile a quello che stai cercando di fare – Cornelius