使用Application.Current.Dispatcher进行单元测试

3
我已经阅读了许多关于在单元测试中为空的帖子,这正是我遇到的确切问题。我找到了这篇文章,正是我正在寻找的。然而,当我试图实现它时,无法编译,报错如下:

Cannot access private constructor 'Dispatcher' here.

在上面的文章中,他们声明有许多方法来实现我下面所列出的代码。由于他没有检查多线程安全性检查,我该如何进行这些检查并使其编译?
    public static Dispatcher RootDispatcher
    {
        get
        {
            if (_rootDispatcher == null)
            {

                if (Application.Current != null)
                {
                    _rootDispatcher = Application.Current.Dispatcher;
                }
                else
                {
                    var thread = Thread.CurrentThread;
                    _rootDispatcher = new Dispatcher(thread);
                }
            }
            return _rootDispatcher;
        }
        internal set { _rootDispatcher = value; }
    }
1个回答

4
编译错误是由于您尝试使用的构造函数实际上是私有的(并且您正在使用它不接受的参数进行调用)。
查看Dispatcher.Current的文档,它说:
获取当前执行线程的Dispatcher,并在没有与线程关联的Dispatcher时创建一个新的。
因此,您可以使用:
_rootDispatcher = Dispatcher.CurrentDispatcher;
从而得到一个Dispatcher实例。
作为一种优化,您可以始终使用Dispatcher.CurrentDispatcher作为“RootDispatcher”。无论Application.Current是否存在。
如果您在生产和测试中都遇到了这段代码,则需要区分这些场景。在生产中使用Application的Dispatcher,在单元测试中使用“任何”Dispatcher(Dispatcher.Current),因为Application不存在。

谢谢您,那我不应该创建RootDispacher类吗? - JamTay317
如果当前线程没有与之关联的Dispatcher实例,Dispatcher.CurrentDispatcher将返回一个新的Dispatcher实例。因此,在单元测试场景中使用它是安全的。如果您在生产和测试中都有这段代码,则需要进行区分。 - LoekD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接