当所有测试在测试项目中运行时管理 Application.Current

2024-02-08

问题介绍

该网站上有几个关于应用.当前当测试的方法/函数包含 Dispatcher 使用时,为 null 问题。第一次我只使用了一个简单的解决方案。我刚刚创建了一个 getter 属性来创建一个new Application()以防止“应用.当前是空问题”。

问题的第一部分:

Application.Current null 问题已解决,但是Dispatcher.BeginInvoke函数从未在 UI 线程上调用,并且该函数抛出异常无效操作异常带有以下消息“调用线程必须是 STA 异常...”我无法理解,因为此异常通常由后台线程或任务抛出,以及使用调度程序问题的解决方案。之后,我在运行测试之前使用了以下代码。

第一次实现:(测试类中构造函数的一部分。)

    var waitForApplicationRun = new TaskCompletionSource<bool>();
    Thread t = new Thread(() =>
    {
       if(Application.Current == null)
             new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };

       Application.Current.Startup += (s, e) => { waitForApplicationRun.SetResult(true); };
       Application.Current.Run();
    });
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
    waitForApplicationRun.Task.Wait();

(这是代码片段的修改版本。)

我的测试方法使用了调度程序,在我的测试中没有任何例外第一堂测试课.

问题的第二部分:

我为我的睾丸创建了多个类,并将此代码片段移至祖先类的构造函数中,因为我不想将此解决方案复制到每个测试类中。所以我为我的测试创建了一个具有通用设置的基类。 当我尝试在测试项目中使用多个类运行所有测试时,我感到震惊,因为我预计测试行为不会改变,但 Application.Current 抛出了无效操作异常并显示以下消息:“调用线程无法访问此对象,因为另一个线程拥有它。”

最后我用锁的使用解决了这个问题。 我使用以下代码片段扩展并修改了我的代码:

第二次实现:(基础测试类的一部分。)

    private Application getApplication
    {
        get
        {
            if (Application.Current == null) new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };

            return Application.Current;
        }
    }

    private static object locker = new object();

    public BaseTest()
    {
        Thread t = new Thread(() =>
        {
            lock (locker)
            {
                getApplication.Startup += (s, e) => Monitor.Pulse(locker);
                getApplication.Run();
                Monitor.Wait(locker);
            }
        });

        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

在我的上一个解决方案之后,所有类测试(在测试项目中)都顺利完成。

这是一个可接受的解决方案还是它似乎隐藏了问题?


在我看来,工作始终是任何代码的积极方面。 有些团队采取不同的方法,避免使用调度员。其他人在存根中使用调度程序的任何代码都可以使用 ioc 进行切换以进行测试。 MVVM 的优点之一是您可以实例化视图模型进行测试,而无需实例化甚至模拟视图。 一些纯粹主义者会说,如果您在视图模型中使用调度程序,那么您就会有视图依赖性,这是不好的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当所有测试在测试项目中运行时管理 Application.Current 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 对象中对象中的 JavaScript `this`?

    抱歉 帖子标题模糊 我无法为这篇文章制定正确的英文名称 例如我有这样一个对象 var APP a 1 b function return this a 这样 如果我打电话console log APP b than this将引用 APP
  • 如何重置 Kafka 偏移量以匹配尾部位置?

    我们将 Storm 与 Kafka 和 ZooKeeper 结合使用 我们遇到过这样的情况 我们必须删除一些主题并用不同的名称重新创建它们 除了现在读取新主题名称之外 我们的 Kafka spouts 保持不变 但是现在 当尝试从新主题读取
  • 在 fluidd 中解析 nginx 入口日志

    我想在 Kubernetes 中使用 Fluentd 解析入口 nginx 日志 这在 Logstash 中相当简单 但我对 fluidd 语法感到困惑 现在我有以下规则
  • Greenlet 运行时错误和在 docker 中部署的应用程序不断启动所有工作人员

    RuntimeWarning greenlet greenlet 大小已更改 可能表示二进制 不兼容 预期来自 C 标头的 144 从 PyObject 得到的为 152 所有的工人都被解雇了 2020 09 28T14 09 41 864
  • 使用 spring 3.x 配置速度工具

    我对弹簧和速度都很陌生 我想使用 spring 3 x 配置速度工具 但我找不到相关的好文章 速度模板未显示会话变量 我从 Spring 控制器设置 至于在spring 3 x中配置Velocity工具 首先将tools xml文件放在有用
  • Java 新手,出现错误“int 无法取消引用”

    我是 java 新手 我已经从事这个练习有一段时间了 但不断收到错误 int 无法取消引用 我看到了几个类似的问题 但仍然无法弄清楚我自己的情况 这是完整的代码 package inclass class OneInt int n OneI
  • 如何在角度2中等待函数完成执行?

    下面是我的代码 我想要login and authenticated 等待的函数getProfile 函数来完成其执行 我尝试了多种方法 例如承诺等 但无法实现 请建议我解决方案 import Injectable from angular
  • 从服务器视频链接生成缩略图 android

    在android中是否可以获取某人的任何类型视频的缩略图 该人仅具有该视频的url链接 并且视频可以来自任何来源 例如youtube或任何来源 请告诉我是否可能 这是我的我试图通过java代码获取youtube视频的缩略图 public c
  • jQuery 延迟和承诺 - .then() 与 .done()

    我一直在阅读有关 jQuery deferreds 和 Promise 的内容 但我看不出使用之间的区别 then done 成功回调 我知道埃里克 海因兹 http www erichynds com jquery using defer
  • java.lang.NoSuchFieldError:android.support.v7.appcompat

    我将我的支持库从 r20 更新到了 r21 现在当我运行我的应用程序时 我收到此错误super onCreate我的主要活动 java lang NoSuchFieldError android support v7 appcompat R
  • iOS:将视图转换为圆柱形

    借助 Quartz 2D 我们可以改变对事物的看法x yand z axis 在某些情况下 我们甚至可以通过更改矩阵的值使它们看起来像 3D 我想知道是否可以将视图转换为圆柱体形状 如下图所示 请忽略气缸的顶部 我更好奇是否有可能扭曲UIV
  • Inno Setup:如何处理[UninstallDelete]部分的进度条?

    我使用 Inno Setup 为我的应用程序制作安装程序 当用户卸载应用程序时 我想删除其中的自定义文件夹Program Data文件夹 我的文件夹很大 大约15 GB 所以我使用 UninstallDelete 删除此文件夹的部分 Uni
  • 用于搜索引擎风格搜索的 JavaScript 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个 JavaScript 库可以确定字符串是否与搜索查询匹配 它应该高效并提供高级查询功能 如
  • 在 JSDoc 中记录开放式参数函数的正确方法

    假设您有如下内容 var someFunc function do something here with arguments 您如何正确记录该函数可以在 JSDoc 中接受任意数量的参数 这是我最好的猜测 但我不确定它是否正确 param
  • 当overflow-x:hidden存在时,overflow-y:visible不起作用[重复]

    这个问题在这里已经有答案了 在 Chrome 或 Firefox 中无法正常工作 有什么解决方法吗 h3 overflow y visible h3 with overflow x hidden div style width 100px
  • 在 PDO 准备好的语句中将值传递给 MySQL IN 操作?

    我有一个表单字段 它返回一个逗号分隔的字符串 我想将其传递给 PHP PDO MySQL 查询 IN 操作 但 IN 操作要求值以逗号分隔 而不是我的string的分隔值 我该怎么做呢 values POST values 10 5 4 3
  • 加特林 websocket 场景中的状态检查

    我有一个加特林场景 我订阅了一个 websocket 并想要检查传入消息的内部一致性 例如 通过 websocket 发送的消息是
  • Joomla 介绍图片作为阅读更多链接

    我想让 joomla 文章介绍图像的行为类似于阅读更多内容和标题链接 因此 用户单击图像 然后加载文章 我不是 PHP 专家 但也许这是阅读更多链接代码 a href class a
  • Google 地图显示“仅用于开发目的”

    当我尝试在网页中显示它时 Google 地图显示消息 仅用于开发目的 我怎样才能让这条消息消失呢 我的代码是这样的
  • 当所有测试在测试项目中运行时管理 Application.Current

    问题介绍 该网站上有几个关于应用 当前当测试的方法 函数包含 Dispatcher 使用时 为 null 问题 第一次我只使用了一个简单的解决方案 我刚刚创建了一个 getter 属性来创建一个new Application 以防止 应用