2017-04-03 4 views
0

ich in meinem init des Viewmodel haben den Folgecode:Mvvmcross Unittest für InvokeOnMainThread

public void Init(int id) 
{ 
    Task.Run(() => { 
     var loadedObjects = service.GetAllById(id); 
     InvokeOnMainThread(() => { 
      foreach(var objectA in loadedObjects) 
      { 
       Items.Add(objectA); 
      } 
     }); 
    } 
} 

Meine Tests ist wie folgt:

[Test] 
public void ShouldTest() 
{ 
    //For additional Setup of MvvmCross and registering of Dispatcher 
    Setup(); 

    var viewModel = new ViewModelObjects(); 
    viewModel.Init(1); 

    Assert.AreEqual(1, viewModel.Items.Count); 
} 

Als ich betreibe meine Test der assert läuft erst nach dass InvokeOnMainThread aufgerufen wird. Mein Gerät verfügt über einen Dispatcher (Aus: https://github.com/MvvmCross/MvvmCross/wiki/Testing)

  1. Grund für Task.Run ist Rest GUI gemacht werden muss.
  2. InvokeOnMainThread löst die ProperyChanged
  3. Tries wie (http://www.damirscorner.com/blog/posts/20140324-HandlingPropertyChangedEventInMvvmCrossViewModelUnitTests.html) funktionierte nicht

Jede Idee, wie ich die Einzelteile testen?

Antwort

1

Task.Run ohne warten, nur die Ausführung des Codes fortgesetzt. Was Sie in Ihrer Items Sammlung sehen, ist möglicherweise nicht das, was Sie erwarten, da der Code innerhalb des Ausdrucks body im Task.Run wahrscheinlich nicht fertig ausgeführt wurde.

Dies ist nicht wirklich ein MvvmCross-Problem. Allerdings ein generelles Threading-Problem.

Ich schlage vor, dass Sie stattdessen InitAsync verwenden und auf die Methode warten. Ihre Tests können auch asynchron sein.

+0

Sie haben Recht, jedoch wird es die App "sperren", bevor der Rest während des Wartens auf die Anfrage gerendert wird –

+0

Nein, es würde die Anwendung nicht "sperren", da es 'async' ist – VMAtm