1

次のようないくつかのメソッドを持つクラスがあります。

private Task Sleep()
{
    return Task.Delay(SleepDuration);
}

public async Task<User> Login(string username, string password)
{
    await Sleep();

    return new User { Id = 1, Username = username };
}

SleepDurationテスト中は0に設定されていることに注意してください。

iOS NUnit プロジェクト テストで次のように呼び出した場合:

myClass.Login("username", "password").Wait();

テスト ランナーの UI が一時停止し、完了しません。ブレークポイントを追加すると、コードはawait. 同じテストは、.Net 4.5 Mono プロジェクトの標準 NUnit ランナーで正常に実行されます。私のアプリケーションでも問題なく動作しますが、呼び出すことはなくWait、常に async/await を使用します。

何か案は?Task.Delayデッドロックを防ぐ代わりに使用できるものは他にありますか? 私はすでに試しTask.Factory.StartNew(() => { })ました。

4

1 に答える 1

2

NUnit の最新バージョンは、SynchronizationContext単体テストをサポートできるように、単体テスト用の を提供しasync voidます。

非同期コード (つまり ) をブロックすると、このコンテキストがデッドロックを引き起こす可能性が非常に高くなりますWaitインタラクションについて詳しく説明したブログ投稿があります。このデッドロックは、まだ完了していない をTask.Delay返す場合にのみ発生することに注意してください。Task非常に短い遅延の場合、 に到達するまでにTaskが完了しているかどうかにかかわらず、競合状態が発生しWaitます。

await単体テストで使用し、テスト メソッドを作成することをお勧めしますasync Task

于 2013-09-29T20:57:34.730 に答える