2016-07-22 18 views
0

Ich habe viele Post über Application.Current.Dispacher gelesen Null als Einheitstests gelesen. Welches ist das genaue Problem, das ich habe. Ich habe This gefunden, was genau ich suche. Jedoch scheint es, dass wenn ich gehe, um dies zu implementieren, ich nicht kompilieren kann. Mit dem Fehler von:Unit Testing mit Application.Current.Dispatcher

Zugriff auf privaten Konstruktor 'Dispatcher' hier nicht möglich.

In dem obigen Post geben Sie an, dass es viele Möglichkeiten gibt, den Code zu implementieren, den ich unten habe. Da er nicht auf Multithreading-Sicherheitschecks geprüft hat. Wie kann ich diese Überprüfungen durchführen und diese kompilieren lassen?

public static Dispatcher RootDispatcher 
    { 
     get 
     { 
      if (_rootDispatcher == null) 
      { 

       if (Application.Current != null) 
       { 
        _rootDispatcher = Application.Current.Dispatcher; 
       } 
       else 
       { 
        var thread = Thread.CurrentThread; 
        _rootDispatcher = new Dispatcher(thread); 
       } 
      } 
      return _rootDispatcher; 
     } 
     internal set { _rootDispatcher = value; } 
    } 

Antwort

2

Der Compiler-Fehler ist auf die Tatsache zurückzuführen, dass der Konstruktor Sie versuchen, in der Tat privat zu verwenden ist (und Sie es mit einem Argument aufrufen, dass es dauert nicht)

mit Blick auf die Dokumentation von Dispatcher.Current, heißt es:

die Ruft für den Thread gerade ausführt und erstellt eine neue, wenn man nicht bereits ist mit dem Faden verbunden.

So können Sie verwenden:

  • _rootDispatcher = Dispatcher.CurrentDispatcher;

in einem Dispatcher-Instanz führt.

Als Optimierung können Sie einfach Dispatcher.CurrentDispatcher als 'RootDispatcher' die ganze Zeit verwenden. Egal ob Application.Current existiert.

Wenn Sie diesen Code sowohl in der Produktion als auch im Test treffen, müssen Sie zwischen diesen Szenarien unterscheiden. Verwenden Sie den Dispatcher der Anwendung in der Produktion, und verwenden Sie "any" Dispatcher (Dispatcher.Current) in Komponententests, da die Anwendung nicht vorhanden ist.

+0

danke, also sollte ich nicht die rootdispacher Klasse erstellen? – JamTay317

+0

Dispatcher.CurrentDispatcher gibt eine neue Dispatcher-Instanz zurück, wenn dem aktuellen Thread noch keine angefügt ist. So sollte es für Unit-Testszenarien sicher sein. Wenn Sie diesen Code in Produktion und Test haben, müssen Sie unterscheiden. – LoekD