【问题标题】:Await asynchronous command in unit test在单元测试中等待异步命令
【发布时间】:2019-02-06 13:50:29
【问题描述】:

我使用基于异步命令 https://msdn.microsoft.com/en-us/magazine/dn630647.aspx

命令的执行者如下所示:

(package) =>
{
    return Task.Run(() =>
    {
        dataProvider.Save(package);
        // emulate long running operation
        for (int i = 0; i < 5000000; ++i)
        {
            string[] ar = new string[1000];
        }
}).ContinueWith(t =>
{
    messagingService.Send(new PackageSavedMessage
    {
        Id = package.Id,
        Name = package.Name,
    });
}, TaskScheduler.FromCurrentSynchronizationContext());

当我点击应用程序中的保存按钮时效果很好,即它异步等待,然后 ContinueWith 触发。

但是当我尝试从单元测试中调用它时

[Test]
public async Task SaveCommand_Test()
{
    using (var scope = _container.BeginLifetimeScope())
    {
        var vm = scope.Resolve<MainViewModel>();
        AsyncCommandBase acb = vm.PackageViewModels[0].SaveCommand as AsyncCommandBase;
        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
        await acb.ExecuteAsync(package);
    }
}

ContinueWith 立即触发,不等待任务完成

如果我没有设置 SynchronizationContext,我会得到一个错误

当前的 SynchronizationContext 不能用作 TaskScheduler。

【问题讨论】:

  • 为什么要手动设置同步上下文?另外,如果你想要单元测试异步的东西,我建议通过IScheduler 传递调度程序,以便你可以替换它们
  • 你怎么知道它不等待?创建 500 万个对象只需要几分之一秒。它可能看起来是瞬间的。设置断点找出答案。
  • @krzysztof-skowronek 你的意思是创建一个可以为我提供上下文的服务? (顺便说一句,主题问题已解决 - 我去异常,实际上正在等待工作)
  • 不,只在构造函数中注入它,如果为空,则一如既往地使用默认值
  • @krzysztof-skowronek 你有例子吗?

标签: c# task


【解决方案1】:

您的执行者不需要使用ContinueWith;更现代的await 也可以工作(注意await will automatically capture and resume its context,因此不需要明确的TaskScheduler):

async (package) =>
{
  await Task.Run(() =>
  {
    dataProvider.Save(package);
    // emulate long running operation
    for (int i = 0; i < 5000000; ++i)
    {
      string[] ar = new string[1000];
    }
  });
  messagingService.Send(new PackageSavedMessage
  {
    Id = package.Id,
    Name = package.Name,
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2018-03-01
    • 2018-01-29
    • 2021-03-25
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多