我有一些异步库方法,重要的是使用ConfigureAwait(false)
"一直向下"。我想编写一个NUnit测试来验证是这样的。我怎样才能做到这一点?我想我必须以某种方式用自定义实现劫持同步上下文?
答案 0 :(得分:3)
我不认为这是可能的。您可以创建自定义同步上下文(请参阅下面的标记答案),但它只会检查等待的第一个调用。如果第一个等待的调用使用ConfigureAwait(false)
,则延续将在不同的线程上运行,该线程不会有SynchronizationContext
,因此无法检查后续异步调用是否使用{{ 1}}或不。
<击> 实际上,自定义同步上下文似乎是唯一的方法。这是一个可能的实现:
ConfigureAwait(false)
然后您可以像这样编写测试:
class TestSynchronizationContext : SynchronizationContext
{
public bool PostCalled { get; private set; }
public override void Post(SendOrPostCallback d, object state)
{
PostCalled = true;
base.Post(d, state);
}
public void Reset()
{
PostCalled = false;
}
}
如果[Test]
public void TestFoo()
{
var context = new TestSynchronizationContext();
SynchronizationContext.SetSynchronizationContext(context);
FooAsync().Wait();
Assert.IsFalse(context.PostCalled);
}
为真,则表示调用了PostCalled
的{{1}}方法,如果SynchronizationContext
不应该这样做被使用了。
击>