InvokeOnMainThread

时间:2017-04-03 14:20:31

标签: c# multithreading unit-testing xamarin mvvmcross

我在viewmodel的init中有以下代码:

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之后,assert首先运行。 我的单位有一个调度员(来自:https://github.com/MvvmCross/MvvmCross/wiki/Testing

  1. Task.Run的原因是需要呈现GUI的其余部分。
  2. InvokeOnMainThread触发ProperyChanged
  3. 尝试(http://www.damirscorner.com/blog/posts/20140324-HandlingPropertyChangedEventInMvvmCrossViewModelUnitTests.html)没有工作
  4. 我知道如何测试这些物品吗?

1 个答案:

答案 0 :(得分:1)

没有等待的

Task.Run只是继续执行代码。因此,您在Items集合中看到的内容可能不是您所期望的,因为Task.Run中表达式主体内部的代码可能还没有完成执行。

这不是真正的MvvmCross问题。但是一般的线程问题。

我建议您改用InitAsync,等待该方法。您的测试也可以是异步的。