Der*_*nch 23 c# wpf unit-testing
我有一个方法,我试图通过单元测试调用.这种方法在现实生活中将从后台线程运行.它使用一些代码来启动对UI线程的调用更新(使用Application.Current.Dispatcher.BeginInvoke....).
然而Application.Current,null当从单元测试中调用时.
我真的不知道要if (Application.Current !=null)解决所有问题.
还有其他方法吗?
_statusUpdates是一个ObservableCollection
下面是我要测试的方法中的代码部分(它更像是集成测试,而不是单元测试才公平).
Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (EventHandler)delegate
{
_statusUpdates.Add(new StatusUpdate
{
DateTime = DateTime.Now,
Message = "Checking For Messages"
});
}, null, null);
Run Code Online (Sandbox Code Playgroud)
She*_*hea 17
以下代码段适用于我:
if (System.Windows.Application.Current == null)
{ new System.Windows.Application { ShutdownMode = ShutdownMode.OnExplicitShutdown }; }
Run Code Online (Sandbox Code Playgroud)
IIRC,我有一个问题,其中Application使用嵌入在WinForms应用程序中的WPF控件为null,并且在StackOverflow的另一个问题中建议将该代码片段作为问题的解决方案(抱歉,无法找到源代码).它解决了单元测试中的相同问题(我不认为在这种情况下需要显式设置ShutdownMode属性).
Jer*_*all 10
如前所述,您Application在单元测试期间根本不会有课程.
也就是说,这里有一个问题,我认为需要解决 - 通过让代码依赖于定义的静态属性,在你的情况下Application.Current.Dispatch,你现在非常紧密地耦合到该类的特定实现,即WPF Application类,你不需要需要.
即使您只是将"当前根调度程序"的概念包含在一个Singleton类式包装器中,现在您还可以将自己与Application类中的变幻莫测的东西分离并直接处理您关注的内容,a Dispatcher:
注意,有很多方法可以写这个,我只是提出了最简单的实现方法; 因此,我不会做任何多线程安全检查等.
public class RootDispatcherFetcher
{
private static Dispatcher _rootDispatcher = null;
public static Dispatcher RootDispatcher
{
get
{
_rootDispatcher = _rootDispatcher ??
Application.Current != null
? Application.Current.Dispatcher
: new Dispatcher(...);
return _rootDispatcher;
}
// unit tests can get access to this via InternalsVisibleTo
internal set
{
_rootDispatcher = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
好的,现在这个实现只比以前略好一些,但至少你现在可以更好地控制对类型的访问,并且不再严格依赖于Application实例的存在.
小智 8
使用 Dispatcher.CurrentDispatcher代替Application.Current.Dispatcher
获取当前正在执行的线程的 System.Windows.Threading.Dispatcher 并创建一个新的 System.Windows.Threading.Dispatcher(如果尚未与线程关联)。
| 归档时间: |
|
| 查看次数: |
16000 次 |
| 最近记录: |