2017-04-03 79 views
0

我在我的視圖模型的初始化後續代碼:Mvvmcross單元測試的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

  1. 原因Task.Run是需要呈現GUI的其餘部分。
  2. InvokeOnMainThread觸發ProperyChanged
  3. 喜歡嘗試次數(http://www.damirscorner.com/blog/posts/20140324-HandlingPropertyChangedEventInMvvmCrossViewModelUnitTests.html)沒有工作

任何想法如何,我可以測試的項目?

回答

1

Task.Run沒有等待只是繼續執行代碼。因此,您在Items集合中看到的內容可能不是您所期望的,因爲Task.Run中表達式主體中的代碼可能尚未完成執行。

這不是一個真正的MvvmCross問題。但是一般的線程問題。

我建議你用InitAsync來代替,並等待該方法。你的測試也可以是異步的。

+0

然而,在等待請求之前,它會「鎖定」應用程序,然後在等待請求時將其餘部分「鎖定」 –

+0

不,它不會'鎖定'應用程序,因爲它是'async' – VMAtm