C# 如何测试使用其ViewDispatcher属性的MvvmCross ViewModel?

C# 如何测试使用其ViewDispatcher属性的MvvmCross ViewModel?,c#,unit-testing,xamarin.android,xamarin,mvvmcross,C#,Unit Testing,Xamarin.android,Xamarin,Mvvmcross,我有一个MvvmCross ViewModel,它继承自MvxBase,并使用其ViewDispatcher属性,如下所示: /// Handles a timer elapsed event private void TimerOnElapsed(object sender, EventArgs eventArgs) { ViewDispatcher.RequestMainThreadAction(UpdateEllapsedTime); } 问题

我有一个MvvmCross ViewModel,它继承自
MvxBase
,并使用其
ViewDispatcher
属性,如下所示:

    /// Handles a timer elapsed event
    private void TimerOnElapsed(object sender, EventArgs eventArgs)
    {
      ViewDispatcher.RequestMainThreadAction(UpdateEllapsedTime);
    }
问题是,当我尝试在单元测试中使用此ViewModel时,ViewDispatcher为null。我在测试中创建并注册了一个模拟调度程序,但是ViewModel的
ViewDispatcher
属性由框架中的父类指定为
MvxMainThreadDispatcher.Instance
,而不是从IoC容器中解析

我当前使用的解决方法如下:

    private void TimerOnElapsed(object sender, EventArgs eventArgs)
    {
        if (ViewDispatcher != null)
        {
            ViewDispatcher.RequestMainThreadAction(UpdateEllapsedTime);
        }
        else
        {
            UpdateEllapsedTime();
        }
    }

我不想仅仅为了让单元测试正常工作而向类中添加代码,但我认为在这种情况下没有什么大不了的。但是,我仍然想知道是否有更好的方法使此ViewModel可测试。

作为一种优化,将
MvxMainThreadDispatcher.Instance
引用中的
ViewDispatcher
缓存在
MvxMainThreadDispatcher.Instance

然而,它也在国际奥委会系统中注册

要在单元测试中使用它,最简单的方法是使用n29 MvvmCross视频中的模拟调度程序-

此单例是使用以下代码创建和注册的:

var mockDispatcher = new MockDispatcher();
        Ioc.RegisterSingleton<IMvxViewDispatcher>(mockDispatcher);
        Ioc.RegisterSingleton<IMvxMainThreadDispatcher>(mockDispatcher);
var mockDispatcher=new mockDispatcher();
Ioc.登记单(mockDispatcher);
Ioc.登记单(mockDispatcher);
并且可以在测试中使用
MvxIoCSupportingTest



如果您认为应该在未来的Mvx版本中对此进行清理,则有一个悬而未决的问题-人们可以在那里发表评论和贡献

感谢您的澄清。一种选择似乎是让我的ViewModel从IOC系统中检索dispatcher,而不是使用它的ViewDispatcher属性。