2017-04-03 6 views
0

のためのユニットテスト:Mvvmcross私はのviewmodelの私のinitでフォローコード持ってInvokeOnMainThread

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

私のテストでは、このようなものです:私は私のテストを実行すると

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

アサートが後に最初に実行されていますInvokeOnMainThreadが呼び出されたことを示します。 私のユニットは、(より:https://github.com/MvvmCross/MvvmCross/wiki/Testing)ディスパッチャを持ってTask.Runため

  1. 理由は、GUIの残りの部分をレンダリングする必要があります。
  2. InvokeOnMainThreadはdidntの仕事(http://www.damirscorner.com/blog/posts/20140324-HandlingPropertyChangedEventInMvvmCrossViewModelUnitTests.html)のようなProperyChanged
  3. トライ

私はアイテムをテストすることができますどのように任意のアイデアをトリガ?

答えて

1

Task.Runコードの実行を待っています。つまり、Itemsコレクションに表示されている内容は、Task.Runの式の本体のコードがおそらく実行を完了していないために期待したものとは異なる場合があります。

これは実際にMvvmCrossの問題ではありません。しかし、一般的なスレッドの問題。

代わりにInitAsyncを使用することをお勧めします。テストも非同期にすることができます。

+0

あなたは正しいですが、要求を待っている間に残りの部分をレンダリングする前にアプリケーションを「ロック」します。 –

+0

いいえ、アプリケーションを「ロック」しません。 – VMAtm

関連する問題