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

この特定の例であなたを助けることはできないと思いますが、良い一般的な戦略は2つのテストを書くことだと思います。1つは同期メソッドが正しいデータを渡すかどうかをテストするためのもので、もう1つは非同期メソッドが正しく機能するかどうかをテストするためのものです。

私は主にJavaScriptで作業しており、その一般的なアプローチが有効です。また、テストフレームワークのドキュメントを確認することもできます。おそらく、このためのいくつかの方法が提供されています。

于 2012-09-28T13:47:21.887 に答える
0

まず、非同期コードをブロックしないでください(私のブログへのリンク)。コードをブロックすることでasync、実際にデッドロックが発生します。単体テストはASP.NETコンテキストではなくスレッドプールコンテキストで実行されるため、このデッドロックはユニットテストでは発生しません(私のブログへのリンク)。

非同期メソッドの同期ラッパーがないのには十分な理由があります。したがって、完全に削除して、 (に名前を変更した)DoSomeWorkだけを残すことをお勧めします。SomeWorkSomeWorkAsync

問題を解決するには、非同期コントローラーアクションを使用する必要があります。

于 2012-09-28T14:05:40.580 に答える