2017-04-03 1 views
0

J'ai dans mon Init du viewmodel le code de suivi:Mvvmcross unittest pour InvokeOnMainThread

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

Mes tests est comme ceci:

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

Quand je lance mon test assert est en cours d'exécution en premier après que InvokeOnMainThread est appelé. Mon unité a un répartiteur (De: https://github.com/MvvmCross/MvvmCross/wiki/Testing)

  1. Raison de Task.Run est le repos de l'interface graphique doit être rendu.
  2. InvokeOnMainThread déclenche les ProperyChanged
  3. Tries comme (http://www.damirscorner.com/blog/posts/20140324-HandlingPropertyChangedEventInMvvmCrossViewModelUnitTests.html) ne marchait pas

Toute idée comment je peux tester les produits?

Répondre

1

Task.Run sans attendre, continue l'exécution du code. Donc, ce que vous voyez dans votre collection Items, peut ne pas être ce que vous attendez car le code à l'intérieur du corps d'expression dans le Task.Run n'a probablement pas fini d'être exécuté.

Ce n'est pas vraiment un problème MvvmCross. Cependant, un problème de threading général.

Je suggère que vous utilisez InitAsync à la place, et attendez la méthode. Vos tests peuvent être asynchrones aussi.

+0

Vous avez raison, mais il va "verrouiller" l'application avant de restituer le reste en attendant la demande. –

+0

Non, cela ne verrouillerait pas l'application, car c'est "async" – VMAtm