web-dev-qa-db-ja.com

NUnit 2からNUnit 3にアップグレードする際のエラー「非同期テストメソッドにはvoid以外の戻り値型が必要」

ユニットテストをNUNIT 2からNUNIT 3にリファクタリングする必要があり、次の構文はエラーをスローします。

var expectedResponseMessage = new HttpResponseMessage();
Func<Task<HttpResponseMessage>> continuation = 
   () => Task.Factory.StartNew(() => expectedResponseMessage);

エラー:

非同期テストメソッドにはvoid以外の戻り値の型が必要です

これをどのように書き換えればよいですか?私は多くの構文を試しましたが、運はありませんでした。

11
Jake Manet

エラー

非同期テストメソッドには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テストで問題がすでに特定されており、 回避策が組み込まれています

15
StuartLC