[解決済み] ユニットテストのためのAsync Voidメソッド呼び出しの待ち時間
2023-06-27 01:45:31
質問
以下のようなメソッドを持っています。
private async void DoStuff(long idToLookUp)
{
IOrder order = await orderService.LookUpIdAsync(idToLookUp);
// Close the search
IsSearchShowing = false;
}
//Other stuff in case you want to see it
public DelegateCommand<long> DoLookupCommand{ get; set; }
ViewModel()
{
DoLookupCommand= new DelegateCommand<long>(DoStuff);
}
こんな感じでユニットテストをしようとしています。
[TestMethod]
public void TestDoStuff()
{
//+ Arrange
myViewModel.IsSearchShowing = true;
// container is my Unity container and it setup in the init method.
container.Resolve<IOrderService>().Returns(orderService);
orderService = Substitute.For<IOrderService>();
orderService.LookUpIdAsync(Arg.Any<long>())
.Returns(new Task<IOrder>(() => null));
//+ Act
myViewModel.DoLookupCommand.Execute(0);
//+ Assert
myViewModel.IsSearchShowing.Should().BeFalse();
}
私のアサートは、モックアップのLookUpIdAsyncが完了する前に呼び出されます。 私の通常のコードでは、それは私が望むものです。 しかし、私のユニットテストでは、私はそれを望んでいません。
私はBackgroundWorkerを使用していたのをAsync/Awaitに変換しています。 バックグラウンドワーカーを使用すると、BackgroundWorkerが終了するのを待つことができるので、これは正しく機能していました。
しかし、async voidメソッドを待つ方法はないようです...。
このメソッドをどのようにユニットテストすればよいですか?
どのように解決するのですか?
単体テストをするための方法を考えました。
[TestMethod]
public void TestDoStuff()
{
//+ Arrange
myViewModel.IsSearchShowing = true;
// container is my Unity container and it setup in the init method.
container.Resolve<IOrderService>().Returns(orderService);
orderService = Substitute.For<IOrderService>();
var lookupTask = Task<IOrder>.Factory.StartNew(() =>
{
return new Order();
});
orderService.LookUpIdAsync(Arg.Any<long>()).Returns(lookupTask);
//+ Act
myViewModel.DoLookupCommand.Execute(0);
lookupTask.Wait();
//+ Assert
myViewModel.IsSearchShowing.Should().BeFalse();
}
ここで重要なのは、私はユニットテストをしているので、非同期呼び出し(async voidの中)が返すようにしたいタスクに置き換えることができるということです。 そして、私は次に進む前にタスクが完了したことを確認するだけです。
関連
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み] C# "internal "アクセス修飾子でユニットテストを行う場合
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。