86

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。ただ興味があるだけです。async voidVisual Studio 2012では、実行できない場合でも、テスト メソッドをビルドするときに警告もエラーも発生しません...

4

3 に答える 3

24

async voidこれは、MSTest が単体テストをサポートしていないためです。それらを実行できるコンテキストを導入することで、これを行うことができます

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

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

于 2013-10-11T13:44:57.707 に答える
23

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

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

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

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);
于 2016-03-07T15:07:35.390 に答える