【问题标题】:Custom SynchronizationContext to set Thread.CurrentPrincipal asynchronously in unittest自定义 SynchronizationContext 以在 unittest 中异步设置 Thread.CurrentPrincipal
【发布时间】:2015-12-24 04:05:39
【问题描述】:

这个问题类似于Set Thread.CurrentPrincipal Asynchronously?。然而,就我而言,我试图让它在 unit-tests 中工作,并希望通过自定义 SynchronizationContext 来解决这个问题。

是否有一个 SynchronizationContext 的行为类似于 ASP.NET 使用的,但它可以被单元测试使用? (我的代码在 ASP.NET 中运行良好。)

特别是,它是 AspNetSynchronizationContext 的特性,它使主体能够“冒泡”出我想要的异步方法。

在 asp.net 应用程序/上下文中调用方法 SetCurrentPrincipalAsync(如下)时,调用方法不会覆盖 Thread.CurrentPrincipal。 - 但是当测试运行时,它会失败。

[Fact]
public async Task SetSynchronizationContext()
{
    //SynchronizationContext.SetSynchronizationContext(new SomeCustomSynchronizationContext());
    await SetCurrentPrincipalAsync();
    Assert.Equal("Name", Thread.CurrentPrincipal.Identity.Name);
}

static async Task SetCurrentPrincipalAsync()
{
    var principal = new GenericPrincipal(new GenericIdentity("Name"), new []{"Role"});
    Thread.CurrentPrincipal = principal;
    if (HttpContext.Current != null)
        HttpContext.Current.User = principal;
    await Task.Delay(TimeSpan.FromSeconds(1));
}

【问题讨论】:

    标签: c# unit-testing asynchronous async-await


    【解决方案1】:

    检查是否在之后

    等待 SetCurrentPrincipalAsync();

    线程没有改变,因为如果 SynchronizationContext.Current == null(并且默认情况下它等于 null,UI 线程等除外)在等待执行后将继续在线程池中的任何可用线程中执行。 另一个建议,使用模拟对象更改所有系统类,例如 HttpContext,测试您的代码而不是系统;)

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多