3

単体テストの残りの部分に進む前に、タスクが完了していることを確認する必要があります。

しかし、それは別のメソッド内で待機しているタスクです (メソッドの単体テストを行っています)。

タスクを待機するか、task.Wait() を呼び出してみましたが、毎回テストが機能しません。

実際の方法は次のようになります。

private async void DoStuff(long idToLookUp)
{
    IOrder order = await orderService.LookUpIdAsync(idToLookUp);   

    OtherStuff = false;
}    

次のように単体テストを試みています。

[TestMethod]
public void TestDoStuff()
{
    //+ Arrange
    var lookupTask = Task<IOrderableTest>.Factory.StartNew(() => validOrder);
    orderService.LookUpIdAsync(Arg.Any<long>()).Returns(lookupTask);

    //+ Act
    myViewModel.DoStuff();
    await lookupTask;

    //+ Assert
    myViewModel.OtherStuff.Should().BeFalse();
}

それが失敗する方法は非常に役に立ちません。これにより、別のテストが「テストの実行中にエージェント プロセスが停止しました」で失敗します。(私が読むことができることは、テストの実行中にバックグラウンド スレッドが例外をスローしたことを意味します。)

そのため、その単体テストが完了するまでコードを待機させる方法を考えています。

私はかなり良いと思われるこの答えを見ました。ただし、メソッドの呼び出しを対象としています。私はそれを呼んでいません、私はただタスクしか持っていません。

注: ansyc パックを使用して .NET 4.0 をターゲットにしています。

4

2 に答える 2

6

voidイベント ハンドラでない限り、メソッドを返す必要はありませんasync(その場合は選択の余地がありません)。asyncメソッドがいつ終了するかを知る方法はありvoidません。

メソッドは を返す必要がありますTask(Task<T>意味のある結果がない場合は ではなく、終了したことを示すだけです)。

が返されたらTaskawaitテスト時にそれを実行するWaitか、適切な場合は を使用します。

メソッドが依存しているタスクの 1 つを待っていますが、それはそれが独自のコードであるという意味ではありません。これは、テストで競合状態が発生したことを意味します。

于 2013-01-10T22:03:10.120 に答える
0

この呼び出し await myViewModel.DoStuff();は、 await キーワードがヒットするとすぐに戻ります (非常に迅速に終了しない限り)。さらに、Slaks が言及したように、void return メソッドを待つことはできません。

var lookupTask = Task<IOrderableTest>.Factory.StartNew(() => validOrder); 次に、 を返すことを除いて、あまり機能していないように見える を待ちますIOrderableTest

さらに、私はあなたがするべきではないと思いますawait lookupTask.これは再び呼び出し元に返されます.この場合、TestRunnerはこれを期待していない/期待していない可能性があります.

代わりに使用する必要がありますlookupTask.Wait()(これはブロッキング呼び出しです)。myViewModel.DoStuff();また、完了までに十分な時間がかかることを確認してください。

まとめ

private async Task DoStuff(long idToLookUp)
{
    IOrder order = await orderService.LookUpIdAsync(idToLookUp);   

    OtherStuff = false;
    return;
}

....

 var task = myViewModel.DoStuff();
 Task.WaitAll(task, lookupTask);
于 2013-01-10T22:01:19.413 に答える