web-dev-qa-db-ja.com

「非同期ボイド」単体テストが認識されないのはなぜですか?

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実行できなくてもテストメソッド...

74
Max

async voidメソッドは「Fire and Forget」と見なされる必要があります-それらが完了するのを待つ方法はありません。 Visual Studioがこれらのテストの1つを開始した場合、テストが完了するのを待つ(成功としてマークする)ことも、発生した例外をトラップすることもできません。

async Taskを使用すると、呼び出し元は実行が完了するまで待機し、実行中に発生した例外をトラップできます。

async void vs async Taskの詳細については、 この回答 を参照してください。

77
Richard

MSTestがasync void単体テストをサポートしていないからです。 可能は、実行可能なコンテキストを導入することで実行します。

MSTestはこれをサポートしていません。おそらく、Microsoftが既存のテストの変更が多すぎると判断したためです(予期しないコンテキストが与えられた場合、既存のテストがデッドロックする可能性があります)。

完全に有効なC#コードであるため、コンパイラの警告/エラーはありません。それが機能しない唯一の理由は、単体テストフレームワークのためです(つまり、xUnitはasync voidテストをサポートしていると思います)。 MSTestを使用していると判断し、async voidを使用したくないと判断します。

21
Stephen Cleary

VS2015で、非同期で装飾されたテストメソッドがテストエクスプローラーに表示されないことがわかりました。最終的にasyncキーワードを削除し、テストのawait呼び出しをtask.Wait()に置き換え、task.Resultでアサーションを実行しました。

正常に動作しているようです。例外テストでまだ試していません。

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);
19
Nick Wright