gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:21:51 25 4
gpt4 key购买 nike

问题介绍

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

问题的第一部分:

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

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

    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();

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

我的测试方法在我的第一个测试类中毫无异常(exception)地使用了调度程序。

问题的第二部分:

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

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

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

    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();
}

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

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

最佳答案

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

关于c# - 在测试项目中运行所有测试时管理 Application.Current,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49456445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com