ユニットテストをNUNIT 2からNUNIT 3にリファクタリングする必要があり、次の構文はエラーをスローします。
var expectedResponseMessage = new HttpResponseMessage();
Func<Task<HttpResponseMessage>> continuation =
() => Task.Factory.StartNew(() => expectedResponseMessage);
エラー:
非同期テストメソッドにはvoid以外の戻り値の型が必要です
これをどのように書き換えればよいですか?私は多くの構文を試しましたが、運はありませんでした。
エラー
非同期テストメソッドにはvoid以外の戻り値の型が必要です
nUnit 3+では、async
ユニットテスト自体が[not戻り値の型がvoid
の場合があります(つまり、[Test] / [TestCase]
で装飾されたメソッドなど)。代わりに、空のTask
を返すことができます(非同期テストをサポートするNUnitの新しいバージョンで正しい方法):
[Test]
public async Task EnsureFoo()
{
// Arrange
// Act
var myResult = await classBeingTested.DoSomethingAsync();
// Assert
Assert.IsNotNull(myResult);
...
}
NUnit 2.xでは、これはチェックされていなかったため、async void
単体テストが単体テストコードベースに挿入される可能性があります。つまり、(Bad、しないでください)これ)
[Test]
public async void Foo() // < -- Error : Async test method must have non-void return type
{
var myResult = await classBeingTested.DoSomethingAsync();
// Post continuation assertions here.
}
これはかなり危険です-テストを待つことはできません*、継続が完了する前に戻る-例継続中に行われたAsserts
の失敗は報告されない場合があります。
Re:あなたの偽のタスク
偽の応答を返すためだけにタスクをスケジュールするのはやり過ぎのようです。つまり、ほとんどのテストでは、Task.FromResult
を使用して次のものを置き換えることができます。
Func<Task<HttpResponseMessage>> continuation =
() => Task.Factory.StartNew(() => expectedResponseMessage);
安いと:
Func<Task<HttpResponseMessage>> continuation =
() => Task.FromResult(expectedResponseMessage);
Task.FromResult
は、指定された戻り値ですでに完了したタスクを返します。独立したタスクをスレッドプールで実行する必要がない限り、ほとんどの場合、これはユニットテストの目的には十分です。
*実際には、NUnit 2.6.4などの以前のバージョンでも、async void
テストで問題がすでに特定されており、 回避策が組み込まれています