4 Stimmen

Unit-Tests mit MVVM Light & DispatcherHelper

Ich habe eine SL4-Anwendung, die das MVVM Light Toolkit verwendet. Innerhalb eines View-Modells rufe ich einen Datendienst auf, der Daten von einem OData-Dienst abruft. Innerhalb der VM verwende ich die DispatcherHelper-Dienstprogrammklasse (Teil von MVVM Light), um die Eigenschaft auf der VM aus den Daten im Rückruf zu aktualisieren, den ich an den Datendienst weitergebe. Meine View Model-Methode sieht zum Beispiel wie folgt aus:

public string CurrentUserLogin {
  get {
    if (string.IsNullOrEmpty(_currentUserLogin))
      RetrieveCurrentUserLogin();
    return string.IsNullOrEmpty(_currentUserLogin) ? _currentUserLogin : _currentUserLogin.Replace(@"\\", @"\");
  }
  set {
    if (_currentUserLogin != value) {
      _currentUserLogin = value;
      RaisePropertyChanged(CurrentUserLoginPropertyName);
    }
  }
}

private void RetrieveCurrentUserLogin() {
  DataService.GetCurrentUserLogin(result => {
    DispatcherHelper.UIDispatcher.BeginInvoke(() => {
      CurrentUserLogin = result;
    });
  });
}

Und so sieht mein Datendienst aus:

public void GetCurrentUserLogin(Action<string> callback) {
  // create query request
  var query = OnDemandContext.CreateQuery<string>("GetCurrentUserLogin");
  var request = (HttpWebRequest)WebRequest.Create(query.RequestUri);
  request.BeginGetResponse(asyncResult => {
    var responseStream = request.EndGetResponse(asyncResult).GetResponseStream();
    var responseDocument = XDocument.Load(responseStream);
    callback(responseDocument.Root.Value);
  }, null);
}

Wenn ich meine SL-Anwendung ausführe, funktioniert alles bestens. Allerdings ist das Problem, das ich habe, wenn ich versuche, Unit-Tests gegen sie mit dem SL Unit Testing Framework zu schreiben. Ich kann meine Datendienst ohne ein Problem zu testen, aber es scheint, dass der DispatcherHelper einen Schraubenschlüssel in alle meine Tests als DispatcherHelper.UIDispatcher ist immer null, wenn gefeuert wirft. Ich nehme an, es hat etwas mit der Initialisierung zu tun (die in meinem SL app Application_Startup() ist). Ich habe versucht, es in meiner Testanwendung zu initialisieren, aber das hilft nicht. Ich habe auch versucht, mit DispatcherHelper.CheckBeginInvokeOnUI(), aber das hat keine Wirkung auf das Problem.

Ideen?

4voto

DevTheo Punkte 921

AC,

Ich habe gerade ein einfaches SL UT-Projekt erstellt und dies in der App.XAML.CS getan

private void Application_Startup(object sender, StartupEventArgs e)
{
  RootVisual = UnitTestSystem.CreateTestPage();
  DispatcherHelper.Initialize();
}

Dann lege ich dies als Test fest (in der Datei tests.cs):

[TestMethod]
public void TestMethod1()
{
   Assert.IsNotNull(DispatcherHelper.UIDispatcher, "UI Dispatcher should not be null");

   DispatcherHelper.CheckBeginInvokeOnUI(() =>
   {
       // Do nothing
       var x = 1;
   });
}

Das hat bei mir funktioniert. Ich habe sogar einen Haltepunkt bei "var x = 1;" gesetzt, und er hat den Haltepunkt getroffen. Ist Ihr Problem damit gelöst? (Wenn ja, markieren Sie es bitte als Antwort).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X