async void
単体テストはVisual Studio 2012内で実行できません。
[TestClass]
public class MyTestClass
{
[TestMethod]
public async void InvisibleMyTestMethod()
{
await Task.Delay(1000);
Assert.IsTrue(true);
}
}
非同期の単体テストが必要な場合、テストメソッドはTaskを返す必要があります。
[TestMethod]
public async Task VisibleMyTestMethod()
{
await Task.Delay(1000);
Assert.IsTrue(true);
}
なぜそうですか?絶対にasync void
テスト方法、私は興味があります。 Visual Studio 2012では、async void
実行できなくてもテストメソッド...
async void
メソッドは「Fire and Forget」と見なされる必要があります-それらが完了するのを待つ方法はありません。 Visual Studioがこれらのテストの1つを開始した場合、テストが完了するのを待つ(成功としてマークする)ことも、発生した例外をトラップすることもできません。
async Task
を使用すると、呼び出し元は実行が完了するまで待機し、実行中に発生した例外をトラップできます。
async void
vs async Task
の詳細については、 この回答 を参照してください。
MSTestがasync void
単体テストをサポートしていないからです。 可能は、実行可能なコンテキストを導入することで実行します。
MSTestはこれをサポートしていません。おそらく、Microsoftが既存のテストの変更が多すぎると判断したためです(予期しないコンテキストが与えられた場合、既存のテストがデッドロックする可能性があります)。
完全に有効なC#コードであるため、コンパイラの警告/エラーはありません。それが機能しない唯一の理由は、単体テストフレームワークのためです(つまり、xUnitはasync void
テストをサポートしていると思います)。 MSTestを使用していると判断し、async void
を使用したくないと判断します。
VS2015で、非同期で装飾されたテストメソッドがテストエクスプローラーに表示されないことがわかりました。最終的にasyncキーワードを削除し、テストのawait呼び出しをtask.Wait()に置き換え、task.Resultでアサーションを実行しました。
正常に動作しているようです。例外テストでまだ試していません。
var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;
Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);