WPF,MVVM,NUnit和Threads ..我做错了

时间:2016-06-04 11:41:13

标签: c# wpf multithreading mvvm nunit

所以..我有WPF和MVVM模式。 ViewModel中的一个线程正在运行一个更新可观察集合的任务,所以当它添加到集合时我会这样做:

Application.Current.Dispatcher.Invoke((Action) (() => 
{
    _files.Add(toAdd);
}));

哪个有效...问题是当我有NUnit测试并且没有我理解的UI线程时,所以我必须首先运行它以将文件添加到集合而不需要调用:

if (Application.Current == null) {
   _files.Add(toAdd);
}));

所以只是为了澄清它的外观

if (Application.Current == null) {
   _files.Add(toAdd);
   return;
}));

Application.Current.Dispatcher.Invoke((Action) (() => 
{
    _files.Add(toAdd);
}));

这感觉不对,因为我在viewmodel中添加了两行逻辑,一行有UI,另一行纯粹用于测试。

任何人都可以了解我的方法出错的地方,或者这是否真的可以接受?

由于

1 个答案:

答案 0 :(得分:1)

我的ViewModel在其构造函数中需要一个IUIThreadHelper。

    public MyViewModel(IUIThreadHelper uiThreadHelper)
    {
        if (uiThreadHelper == null)
            throw new ArgumentNullException(nameof(uiThreadHelper));
        this.uiThreadHelper = uiThreadHelper;
    }

IUIThreadHelper看起来像:

public interface IUIThreadHelper
{
    void InvokeAction(Action action);
}

在正常运行时,我给它一个使用应用程序调度程序的UIThreadHelper。

在测试中,我给它一个简单的假货:

        IUIThreadHelper uiThreadHelper = new Fakes.StubIUIThreadHelper()
        {
            InvokeActionAction = (a) => a(),
        };

所以我可以简单地使用它:

this.uiThreadHelper.InvokeAction(() => header.Children.Add(newChild));