Unit testing 如何对调用异步方法的同步方法进行单元测试?

Unit testing 如何对调用异步方法的同步方法进行单元测试?,unit-testing,asynchronous,synchronous,async-await,Unit Testing,Asynchronous,Synchronous,Async Await,为调用异步方法的同步方法编写单元测试的正确方法是什么。 现在我的单元测试通过了,但是当我尝试打开页面时,它永远不会返回。 为什么我的单元测试没有失败?我怎样才能让它失败 我用以下简单代码复制了我的问题: 我的通过测试: [TestMethod] public void DoSomeWork_WhenWeDoSomeWork_ShouldReturnDone() { var service = new SyncService(); const strin

为调用异步方法的同步方法编写单元测试的正确方法是什么。 现在我的单元测试通过了,但是当我尝试打开页面时,它永远不会返回。 为什么我的单元测试没有失败?我怎样才能让它失败

我用以下简单代码复制了我的问题:

我的通过测试:

   [TestMethod]
   public void DoSomeWork_WhenWeDoSomeWork_ShouldReturnDone()
   {
      var service = new SyncService();

      const string expected = "Done";
      var actual = service.DoSomeWork();

      Assert.AreEqual(expected, actual);

   }
我的观点永远不会回来:

    public ActionResult Index()
    {
       var syncService = new SyncService();

        return View((object)syncService.DoSomeWork());
    }
永不返回查看的我的服务:

    public class SyncService
    {
       public string DoSomeWork()
       {
          return SomeWork().GetAwaiter().GetResult();
       }

       private async Task<string> SomeWork()
       {
          var task1 = Task.Delay(1000);
          var task2 = Task.Delay(1000);

          await Task.WhenAll(task1, task2);

          return "Done";
       }
    }
公共类同步服务
{
公共字符串DoSomeWork()
{
返回SomeWork().GetAwaiter().GetResult();
}
私有异步任务SomeWork()
{
var task1=任务延迟(1000);
var task2=任务延迟(1000);
等待任务。WhenAll(任务1,任务2);
返回“完成”;
}
}

我不认为我能在这个具体示例中帮助您,但我认为一个好的总体策略是编写两个测试。一个用来测试同步方法是否传递了正确的数据,另一个用来测试异步方法是否工作正常

我主要在JavaScript中工作,这种通用方法对我适用。您也可以查看测试框架的文档,也许它提供了一些方法。

首先,(链接到我的博客)。通过阻塞
async
code,实际上是在造成死锁。这种死锁不会发生在单元测试中,因为(链接到我的博客)

有。因此,我建议彻底摆脱
DoSomeWork
,只留下
SomeWork
(重命名为
SomeWorkAsync


要解决您的问题,您应该使用。

+1这始终是一个很好的做法。将线程/异步逻辑与任何其他逻辑分开。