2010-03-16 6 views
6

Ich möchte eine Anwendung testen, die einen Textblock mit einem Datenfeldwert rendert. Ich möchte die tatsächliche Breite und tatsächliche Höhe erhalten, sobald das Rendering abgeschlossen ist. Alles funktioniert gut. Das Problem kam zuerst, als ich versuchte, die Anwendung zu testen. Ich kann den Dispatcher vom Testprojekt nicht aufrufen.Wie WPF Dispatcher in Nunit aufrufen?

Folgendes ist der Code.

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

Ich habe gerade mit der NUnit begonnen. Also, bitte hilf mir.

Dank

Antwort

1

Ich habe nUnit nicht verwendet, um Komponententests vorher zu schreiben, aber das ist ein häufiges Problem mit VS-Einheitentests. Was passieren kann, ist, dass jeder Test einen anderen Dispatcher verwendet und WPF erfordert, dass Sie denselben Dispatcher verwenden. Um dies zu umgehen, erstellen Sie eine statische Klasse, um den Dispatcher zwischenzuspeichern und anschließend alles durch sie aufzurufen.

+0

Genau, wonach ich gesucht habe. Danke Steven toll :) –

2

Sie könnten Sie beschäftigt sich mit einem DispatcherTimer in WPF und NUnit, die wiederum verwendet die Dispatcher bei http://www.codeproject.com/KB/WPF/UnitTestDispatcherTimer.aspx suchen.

bearbeiten

Von Link versuchen und tun dies vor Ihrem Test:

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

Und es nach dem Test zu stoppen.

+0

Hallo Cornelius, danke für den Link. Ich konnte es nicht verstehen. Können Sie mir bitte, geben Sie mir mehr Details, wie Dispatchertimer in diesem Szenario hilfreich sind. –

+0

Ich glaube nicht, dass Sie den DispatcherTimer verwenden sollten, aber der Link beschreibt das Problem bei der Verwendung des Timers, der mit dem Dispatcher außerhalb eines WPF-Projekts verwandt ist, ähnlich dem, was Sie gerade versuchen. – Cornelius