【发布时间】:2015-07-14 04:10:12
【问题描述】:
我正在尝试对使用 Prism 事件聚合器的应用程序中的某些行为进行单元测试。我尝试进行单元测试的代码的其中一件事是订阅 UI 线程上的事件。深入研究EventAggregator's implementation,我发现它是通过SynchronizationContext.Post 实现的。
我认为this answer 可能是一个很好的解决方法,但我最终使用了一个更简单的解决方法:在单元测试开始时显式设置同步上下文 - 在您尝试阅读 SynchronizationContext.Current 之前,该方法一直有效
这导致了我不完全理解的行为:
//set the sync context
var thisSyncContext = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(thisSyncContext);
thisSyncContext.Post(cb => {
var ctx = SynchronizationContext.Current; //<-- this is null
var equals = thisSyncContext.Equals(ctx); //<-- this is false
},null);
thisSyncContext.Send(cb => {
var ctx = SynchronizationContext.Current; //<-- this is not null
var equals = thisSyncContext.Equals(ctx); //<-- this is true
}, null);
我知道 Post 是异步发生的,而 Send 是同步发生的,当我在线程调试窗口中观察它时,它实际上会跳转到不同的线程 ID,正如您所期望的异步调用所做的那样。
我想我想理解的是,当我告诉同步上下文执行一个函数时,无论是同步还是异步,我都希望该上下文被保留。它保留用于同步调用,但不用于异步。
为什么会出现这种行为,如何在单元测试中对其进行补偿?
【问题讨论】:
标签: c# .net unit-testing synchronizationcontext