4

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

我用这个简单的代码复制了我的问题:

我的通过测试:

   [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";
       }
    }
4

2 回答 2

1

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

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

于 2012-09-28T13:47:21.887 回答
0

首先,不要阻塞异步代码(链接到我的博客)。通过阻塞async代码,您实际上会导致死锁。这种死锁不会发生在您的单元测试中,因为单元测试在线程池上下文中运行,而不是在 ASP.NET 上下文中运行(链接到我的博客)。

异步方法没有同步包装器是有充分理由的。所以我建议完全摆脱DoSomeWork,只留下SomeWork(重命名为SomeWorkAsync)。

要解决您的问题,您应该使用异步控制器操作

于 2012-09-28T14:05:40.580 回答